如何解决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()
上使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。