PyQt5 线程、信号和槽连接错误

问题描述

我是 PyQt5 的新手,我似乎无法连接我的 pyqtSignal 和 pyqtSlot。错误“TypeError: connect() 在 worker.newIcon[object] 和 updateIcon() 之间失败” 弹出。任何人都可以指导我走上正确的道路吗?

from PyQt5.QtWidgets import QApplication,QSystemTrayIcon,QAction,QMenu
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QObject,QThread,pyqtSignal,pyqtSlot


class worker(QThread):
    newIcon = pyqtSignal(object)

    def run(self):
        while True:
            self.newIcon.emit(QIcon("shield-off.png"))
            QThread.msleep(1000)


class systemTray():
    def start_tray(self):
        self.app = QApplication([])
        self.app.setQuitOnLastwindowClosed(False)

        icon = QIcon("shield-on.png")
        self.tray = QSystemTrayIcon()
        self.tray.setIcon(icon)
        self.tray.setVisible(True)

        self.menu = QMenu()
        self.quit = QAction("Exit")
        self.quit.triggered.connect(self.app.quit)
        self.menu.addAction(self.quit)
        self.tray.setContextMenu(self.menu)

        self.thread = QThread()
        self.worker = worker()
        self.worker.movetoThread(self.thread)
        self.worker.newIcon.connect(self.updateIcon)
        self.thread.started.connect(self.worker.run)
        self.thread.start()

        # Run tray
        self.app.exec_()

    @pyqtSlot(object)
    def updateIcon(self,icon):
        self.tray.setIcon(icon)


if __name__ == "__main__":
    be_tray = systemTray()
    be_tray.start_tray()

解决方法

DECLARE @bookID uniqueidentifier,@CustID uniqueidentifier; EXEC dbo.spBookReturn @loanID,@bookID OUTPUT,@CustID OUTPUT; --SELECT @bookID,@CustID; 装饰器旨在用于 pyqtSlot 子类,否则将无法正常工作。

所以,解决方案非常简单,因为您只需要从 QObject 继承:

QObject

另一方面,很少需要使用 class systemTray(QObject): def start_tray(self): # ... 装饰器,并且仅适用于特定情况(请参阅 this related answer。在您的情况下,它似乎没有必要。

此外,由于您已经从 QThread 继承了子类,您可以只使用它自己的 pyqtSlot,而无需在新的 start() 上使用。