PyQt5: как подключиться () и emit () - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь перенести код из PyQt4 в PyQt5 и не понимаю, почему не работает следующее.Слот не вызывается.Я вижу кучу тиков и никаких токов.Чего мне не хватает?

from PyQt5 import QtCore
import time

# expect to see ticks & tocks
class Alarm(QtCore.QThread, QtCore.QObject):
    signal = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(Alarm, self).__init__(parent)
        self.signal.connect(self.eventp)
        self.start()

    def run(self):
        while True:
            print('tick')
            self.signal.emit()
            time.sleep(1)

    @QtCore.pyqtSlot()
    def eventp(self):
        print('Tock')

# main
alarm = Alarm()
time.sleep(6)  # wait for countdown, then terminate

1 Ответ

0 голосов
/ 27 декабря 2018

Первый QThread уже наследуется от QObject, поэтому нет необходимости использовать его в качестве интерфейса.С другой стороны, QThread должен находиться в цикле событий, так как именно это позволяет передавать сигналы, например, в вашем случае вы блокируете цикл событий с помощью time.sleep (6) вместо того, чтобы завершить цикл после6 секунд используйте QTimer:

import time
from PyQt5 import QtCore
# expect to see ticks & tocks
class Alarm(QtCore.QThread):
    signal = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(Alarm, self).__init__(parent)
        self.signal.connect(self.eventp)
        self.start()

    def run(self):
        while True:
            print('tick')
            self.signal.emit()
            time.sleep(1)

    @QtCore.pyqtSlot()
    def eventp(self):
        print('Tock')

if __name__ == '__main__':
    import sys
    app = QtCore.QCoreApplication(sys.argv)
    alarm = Alarm()
    QtCore.QTimer.singleShot(6*1000, QtCore.QCoreApplication.quit)
    sys.exit(app.exec_())
...