Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何将PyQt5插槽连接到类中的信号函数?_Python 3.x_Pyqt5 - Fatal编程技术网

Python 3.x 如何将PyQt5插槽连接到类中的信号函数?

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):

我试图在一块UI代码和一个单独的python类之间设置一个pyqt信号,该类仅用于处理事件响应。我不想让UI代码访问处理程序(经典的MVC风格)。不幸的是,我很难将插槽连接到信号。代码如下:

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。不知道是否有文档记录,但请参阅一个可能需要的场景。