pyqt自定义信号与信号重载

在C++中,自定义信号的写法是

signals:
     void sig1();
     void sig2();

一  pyqt自定义信号

pyqt的自定义信号要类pyqtSignal来定义:

    # 定义一个信号
    # 无参数信号 signal1 = pyqtSignal()
    signal1 = pyqtSignal(object)

    # 发送3个参数的信号
    signal2 = pyqtSignal(str,int,int)

发送信号还是用emit, 只是写法不同

self.signal1.emit('Hello PyQt5')

二 信号重载

pyqt还可以进行信号重载,例如下面的信号

 # 声明一个重载版本的信号,也就是槽函数的参数可以是int和str类型,也可以只有一个str类型的参数
 signal3 = pyqtSignal([int, str], [str])

重载的信号发送和槽链接与上面的有所不同

发送

    def run3(self):
        self.signal3[int,str].emit(111, "1 asd")

    def run3Overload(self):
        self.signal3[str].emit("wer")

链接

send.signal3[int,str].connect(slot.get3)
send.signal3[str].connect(slot.get3Overload)

 本例子全部代码如下:

from PyQt5.QtCore import *
class MyTypeSignal(QObject):
    # 定义一个信号
    # 无参数信号 signal1 = pyqtSignal()
    signal1 = pyqtSignal(object)

    # 发送3个参数的信号
    signal2 = pyqtSignal(str,int,int)

    # 声明一个重载版本的信号,也就是槽函数的参数可以是int和str类型,也可以只有一个str类型的参数
    signal3 = pyqtSignal([int, str], [str])

    def run1(self):
        self.signal1.emit('Hello PyQt5')

    def run2(self):
        self.signal2.emit("hello",3,4)

    def run3(self):
        self.signal3[int,str].emit(111, "1 asd")

    def run3Overload(self):
        self.signal3[str].emit("wer")


class MySlot(QObject):
    def get1(self,msg):
        print("信息:" + msg)

    def get2(self,msg,a,b):
        print(msg)
        print(a+b)

    def get3(self,val,text):
        print("sig3 emit,int str:", val,text)

    def get3Overload(self,val):
        print("sig3 overload emit,str:", val)


if __name__ == '__main__':
    send = MyTypeSignal()
    slot = MySlot()

    send.signal1.connect(slot.get1)
    send.signal2.connect(slot.get2)
    send.signal3[int,str].connect(slot.get3)
    send.signal3[str].connect(slot.get3Overload)

    #发信号
    send.run1()
    send.run2()
    send.run3()
    send.run3Overload()

    #断开连接后再发信号,槽函数收不到
    send.signal1.disconnect(slot.get1)
    send.run1()

运行结果

pyqt自定义信号与信号重载

 

上一篇:java-反射详解


下一篇:如何替换请求URL中的文字?