Изящно выход из QCoreApplication без флагов и прерывание предыдущего запущенного кода - PullRequest
0 голосов
/ 23 апреля 2020

Следующий скрипт приводит к следующему выводу при запуске и нажатии Ctrl + C.

>> SIGINT or CTRL-C detected. Exiting gracefully
Clean up
Return from loop due to stop
Final clean up

Есть ли способ заставить QCoreApplicaiton выйти без возврата к l oop в infinitel oop? Я хотел бы избежать использования флага и проверки его все время в разных частях кода. Другими словами, я хочу, чтобы программа записывала системное событие, очищала его и корректно выходила, независимо от того, что она, возможно, делала.

from signal import signal, SIGINT
import sys
from PySide2.QtCore import QCoreApplication, QTimer


class App(QCoreApplication):
    def __init__(self, args):
        super(App, self).__init__(args)
        self.__stop = False
        self.aboutToQuit.connect(self.finalcleanup)
        QTimer.singleShot(0, self.infiniteloop)

    def finalcleanup(self):
        print('Final clean up')

    def cleanup(self):
        print('Clean up')

    def handler(self, signal_received, frame):
        print('SIGINT or CTRL-C detected. Exiting gracefully')
        self.__stop = True
        self.cleanup()
        self.quit()

    def infiniteloop(self):
        while 1:
            if self.__stop:
                print('Return from loop due to stop')
                return
            getinput()


def getinput():
    try:
        x = input('>> ')
        print(x)
    except:
        pass


if __name__ == '__main__':
    app = App(sys.argv)
    signal(SIGINT, app.handler)
    sys.exit(app.exec_())

Мои настройки:

  • Windows 10
  • Python 3.7
  • PySide2 5.13.2

Я хочу использовать Qt, потому что мое окончательное приложение получит пользу от сигнала / слота модель.

...