PyQt5-自定义信号的使用
信号与槽的一些特点和功能
在PyQt5中,信号与槽的使用有如下一些特点。
· 一个信号可以关联多个槽函数。
· 一个信号也可以关联其他信号。
· 信号的参数可以是任何Python数据类型。
· 一个槽函数可以和多个信号关联。
· 关联可以是直接的(同步)或排队的(异步)。
· 可以在不同线程之间建立关联。· 信号与槽也可以断开关联。
上节的示例使用的信号都是类的内建信号,在自定义类中还可以自定义信号。
使用自定义信号在程序的对象之间传递信息是非常方便的,例如在多窗体应用程序中,通过信号与槽在窗体之间传递数据。
使用PyQt5.QtCore.pyqtSignal()为一个类定义新的信号。要自定义信号,类必须是QObject类的子类。pyqtSignal()的句法是:
信号可以带有参数types,后面的参数都是一些可选项,基本不使用。
信号需要定义为类属性,这样定义的信号是未绑定(unbound)信号。当创建类的实例后,PyQt5会自动将类的实例与信号绑定,这样就生成了绑定的(bound)信号。这与Python语言从类的函数生成绑定的方法的机制是一样的。
一个绑定的信号(也就是类的实例对象的信号)具有connect()、disconnect()和emit()这3个函数,分别用于关联槽函数、断开与槽函数的关联、发射信号。
自定义信号使用示例
下面是示例程序human.py的完整代码,这个程序演示了自定义信号的使用,以及信号与槽的使用中一些功能的实现方法。
## 自定义信号与槽的演示
import sys
from PyQt5.QtCore import QObject,pyqtSlot,pyqtSignal
class Human(QObject):
##定义一个带str类型参数的信号
nameChanged=pyqtSignal(str)
##overload型信号有两种参数 一种是int,另一种是str
ageChanged=pyqtSignal([int],[str])
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)# 发射int参数信号
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参数信号
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)
## @pyqtSlot (str)
def do_nameChanged(self,name):
print("Hello," + name)
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型参数
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信号
使用信号与槽的一些注意事项
转载请注明出处,欢迎讨论和交流!