Qt для Python QCoreApplication: как выйти из приложения без графического интерфейса - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть небольшое приложение без графического интерфейса, которое в основном запускает цикл обработки событий, подключает сигнал к слоту и излучает сигнал.Я хотел бы, чтобы слот остановил цикл обработки событий и вышел из приложения.

Однако приложение не завершило работу.

У кого-нибудь есть идеи, как выйти из цикла обработки событий?

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_())

1 Ответ

0 голосов
/ 04 февраля 2019

Когда вы вызываете app.exec_(), вы входите в цикл событий Qt, но поскольку вы выполняете код, который вызывает quit() в момент инициализации объекта, ваше приложение никогда не закроется.

Я могу придумать два варианта выполнения процесса «выхода», который вы хотите выполнить:

  • Просто позвоните sys.exit(1) внутри stop_test() вместо вызова quit или exit, или
  • вы используете 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_())
...