如何将PyQt5插槽连接到类中的信号功能?

时间:2016-08-29 16:01:19

标签: python-3.x pyqt5

我试图在一个UI代码块和一个单独的python类之间设置一个pyqt信号,该python类仅用于处理事件响应。我不想让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)

     

文件" C:\ git \ IonControl \ testpyqtslot.py",第17行,在寄存器中

     

mySignal.connect(self.receive_signal)

     

TypeError:connect()在UiClass.mySignal [str]和receive_signal()

之间失败

我希望这段代码能够成功地将信号注册到插槽中并让处理程序打印出来" hello world"在末尾。我在这里做错了什么?

我的基本问题是:如何将信号连接到属于类的插槽函数?

1 个答案:

答案 0 :(得分:3)

发生错误的原因是您在不从pyqtSlot继承的类中使用QObject装饰器。您可以通过删除装饰器或使HandlerClass成为QObject的子类来解决问题。

pyqtSlot的主要目的是允许定义槽的几个不同重载,每个重载具有不同的签名。在进行跨线程连接时,有时也可能需要它。但是,这些用例相对较少,在大多数PyQt应用程序中,根本不需要使用pyqtSlot。信号可以连接到任何 python可调用对象,无论它是否被装饰为插槽。