import sys
from PyQt5.QtCore import QObject,pyqtSlot,pyqtSignal
class Human(QObject):
nameChanged=pyqtSignal(str)
# nameChanged信号是带有一个str类型参数的信号
ageChanged=pyqtSignal([int],[str])
# ageChanged信号是具有两种类型参数的overload型的信号,类型可以是str,或是int型
def __init__(self,name='Mike',age=10,parent=None):
super().__init__(parent)
self.setAge(age)
self.setName(name)
def setAge(self,age):
self.__age=age
self.ageChanged.emit(self.__age)
# 通过信号的emit()函数发射信号。在类的某个状态发生变化,需要通知外部发生了这种变化时,发射相应的信号。
# 如果信号关联了一个槽函数,就会执行槽函数。如果未关联,则不会产生任何反应。
# 例如在Human.setName()函数中,当变量self.__name发生变化时,发射nameChanged信号,并且传递参数。
# 即:self.nameChanged.emit(self.__name),其中变量self.__name作为信号的参数,关联的槽函数可以从参数中获取当前信号的名称,
# 从而进行相应的处理。
if age<=18:
ageInfo="你是少年"
elif (18<age<=35):
ageInfo="你是年轻人"
elif (35<age<=55):
ageInfo="你是中年人"
elif (55<age<=80):
ageInfo="你是老人"
else:
ageInfo="你是寿星啊"
self.ageChanged[str].emit(ageInfo) #发射str参数信号
# Human.setAge()函数中发射了两次ageChanged信号,但是使用了不同的参数,分别是int参数和str参数
# 即:self.ageChanged.emit(self.__age)
# self.ageChanged[str].emit(ageInfo)
def setName(self,name):
self.__name=name
self.nameChanged.emit(self.__name)
class Responsor(QObject):
@pyqtSlot(int)
def do_ageChanged_int(self,age):
print("你的年龄是:"+str(age))
@pyqtSlot(str)
def do_ageChanged_str(self,ageInfo):
print(ageInfo)
## 在信号对应的方法中,因为信号ageChanged有两种参数类型,同时需要和两种参数都建立连接,采用两个槽函数类型不同的方法,
## 即:do_ageChanged_int,do_ageChanged_str
## @pyqtSlot说明槽函数的数据类型,使得信号和槽之间能够正确关联。比如:PyQt5中的overload类型的信号,一般只为其中的一种信号编写槽函数。
## @pyqtSlot(str)
def do_nameChanged(self,name):
print("Hello",+name)
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
print("**创建对象时**")
boy=Human("Boy",16)
resp=Responsor()
boy.nameChanged.connect(resp.do_nameChanged)
## overload 的信号,两个槽函数不能同名,关联时需要给信号加参数区分
boy.ageChanged.connect(resp.do_ageChanged_int) #默认参数,int型
boy.ageChanged[str].connect(resp.do_ageChanged_str) #默认参数,str类型
## ageChanged信号默认参数类型为int型,对于另外一个非默认参数为str型,在信号关联时需要注明。
print("\n**建立关联后**")
boy.setAge(35) #发射两个ageChanged信号
boy.setName("Jack") #发射nameChanged信号
boy.ageChanged[str].disconnect(resp.do_ageChanged_str) #断开关联
print("\n **断开ageChanged[str]的关联后**")
boy.setAge(10) #发射两个ageChanged信号
解释在代码的注释中。