Python 3.x 如何将PyQt5插槽连接到类中的信号函数?
我试图在一块UI代码和一个单独的python类之间设置一个pyqt信号,该类仅用于处理事件响应。我不想让UI代码访问处理程序(经典的MVC风格)。不幸的是,我很难将插槽连接到信号。代码如下:Python 3.x 如何将PyQt5插槽连接到类中的信号函数?,python-3.x,pyqt5,Python 3.x,Pyqt5,我试图在一块UI代码和一个单独的python类之间设置一个pyqt信号,该类仅用于处理事件响应。我不想让UI代码访问处理程序(经典的MVC风格)。不幸的是,我很难将插槽连接到信号。代码如下: from PyQt5 import QtCore from PyQt5.QtCore import QObject class UiClass(QObject): mySignal = QtCore.pyqtSignal( str ) def __init__(self):
from PyQt5 import QtCore
from PyQt5.QtCore import QObject
class UiClass(QObject):
mySignal = QtCore.pyqtSignal( str )
def __init__(self):
QObject.__init__(self)
def send_signal(self):
self.mySignal.emit("Hello world!")
class HandlerClass():
currentMessage = "none"
def register(self, mySignal):
mySignal.connect(self.receive_signal)
@QtCore.pyqtSlot(str)
def receive_signal(self, message):
self.currentMessage = message
print(message)
ui = UiClass()
handler = HandlerClass()
handler.register(ui.mySignal)
ui.send_signal()
当我运行此代码时,它在handler.register行失败。以下是错误:
回溯(最近一次呼叫最后一次):
文件“C:\git\IonControl\testpyqtslot.py”,第25行,在
handler.register(ui.mySignal)
寄存器中第17行的文件“C:\git\IonControl\testpyqtslot.py”
mySignal.connect(self.receive_信号)
TypeError:UiClass.mySignal[str]和receive_signal()之间的连接()失败
我希望这段代码能够成功地将信号注册到插槽,并让处理程序在最后打印“hello world”。我做错了什么
我的基本问题是:如何将信号连接到作为类一部分的插槽函数?发生错误的原因是,您在一个不是从
QObject
继承的类中使用pyqtSlot
装饰器。您可以通过去掉decorator或将HandlerClass
作为QObject
的子类来解决此问题
pyqtSlot
的主要目的是允许定义插槽的多个不同重载,每个重载具有不同的签名。在进行交叉螺纹连接时,有时也可能需要使用。然而,这些用例相对较少,在大多数PyQt应用程序中根本不需要使用pyqtSlot
。信号可以连接到任何python可调用对象,无论它是否装饰为插槽。发生错误的原因是您在一个类中使用的是pyqtSlot
装饰器,该类不继承自QObject
。您可以通过去掉decorator或将HandlerClass
作为QObject
的子类来解决此问题
pyqtSlot
的主要目的是允许定义插槽的多个不同重载,每个重载具有不同的签名。在进行交叉螺纹连接时,有时也可能需要使用。然而,这些用例相对较少,在大多数PyQt应用程序中根本不需要使用pyqtSlot
。信号可以连接到任何python可调用对象,无论它是否装饰为插槽。我将HandlerClass作为QObject的子类,它工作得很好。谢谢交叉螺纹连接何时需要?总是吗?这有什么记录吗?@DavidPärsson。我不知道它是否有文档记录,但请看一个可能需要它的场景。我将HandlerClass作为QObject的一个子类,它工作得很好。谢谢交叉螺纹连接何时需要?总是吗?这有什么记录吗?@DavidPärsson。不知道是否有文档记录,但请参阅一个可能需要的场景。