在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()
运行结果