Qt的Python的QCoreApplication:如何退出非GUI应用程序

问题描述 投票:0回答:1

我有基本上开始事件循环,一个信号连接到一个插槽中,并且发射信号的小的非GUI应用程序。我想插槽停止事件循环和退出应用程序。

但是,应用程序不会退出。

有没有人对如何从事件循环退出任何想法?

Python的3.7.0

Qt的Python的(PySide2)5.12.0

import sys
from PySide2 import QtCore, QtWidgets

class ConsoleTest(QtCore.QObject):
    all_work_done = QtCore.Signal(str)

    def __init__(self, parent=None):
        super(ConsoleTest, self).__init__(parent)
        self.run_test()

    def run_test(self):
        self.all_work_done.connect(self.stop_test)
        self.all_work_done.emit("foo!")

    @QtCore.Slot(str)
    def stop_test(self, msg):
        print(f"Test is being stopped, message: {msg}")
        # neither of the next two lines will exit the application.
        QtCore.QCoreApplication.quit()
        # QtCore.QCoreApplication.exit(0)
        return

if __name__ == "__main__":
    app = QtCore.QCoreApplication(sys.argv)
    mainwindow = ConsoleTest()
    sys.exit(app.exec_())
python pyside2
1个回答
0
投票

当你调用app.exec_()你进入了Qt事件循环,但因为你正在执行调用quit()在对象被初始化的时刻的代码,你的应用程序将永远不会退出。

我能想到的两种选择达到你想要做的“退出”的过程:

  • 只需拨打sys.exit(1)stop_test()代替quitexit调用之内,或
  • 您使用singleShot退出应用程序:
import sys
from PySide2 import QtCore, QtWidgets

class ConsoleTest(QtCore.QObject):
    all_work_done = QtCore.Signal(str)

    def __init__(self, parent=None):
        super(ConsoleTest, self).__init__(parent)
        self.run_test()

    def run_test(self):
        self.all_work_done.connect(self.stop_test)
        self.all_work_done.emit("foo!")

    @QtCore.Slot(str)
    def stop_test(self, msg):
        print(f"Test is being stopped, message: {msg}")
        QtCore.QTimer.singleShot(10, QtCore.qApp.quit)

if __name__ == "__main__":
    app = QtCore.QCoreApplication(sys.argv)
    mainwindow = ConsoleTest()
    sys.exit(app.exec_())
© www.soinside.com 2019 - 2024. All rights reserved.