使用自定义信号,需要使用PyQt6.QtCore.pyqtSignal()
信号需要定义为类属性,这样定义的信号是未绑定信号
当创建类的实例后,PyQt 会自动将类的实例与信号绑定,生成了绑定的信号
一个绑定的信号具有 connect()、disconnect()和 emit()三个函数
●connect():关联槽函数
●disconnect():断开与槽函数的关联
●emit():发射信号
来举个例子吧
from PyQt6.QtCore import QObject
from PyQt6.QtCore import pyqtSignal
from PyQt6.QtCore import pyqtSlot
class Human(QObject):
nameChanged = pyqtSignal(str)
ageChanged = pyqtSignal([int], [str])
def __init__(self, name='王红', age=32, parent =None):
super().__init__(parent)
self.setAge(age)
self.setName(name)
def setAge(self, age):
self.__age=age
self.ageChanged.emit(self.__age)
if age<=18:
ageInfo = "你是 少年"
elif(18<age<=35):
ageInfo="你是 年轻人"
elif(25<age<=55):
ageInfo="你是 中年人"
elif(55<age<=80):
ageInfo="您是 老人"
else:
ageInfo="您是 寿星啊"
self.ageChanged[str].emit(ageInfo)
def setName(self, name):
self.__name=name
self.nameChanged.emit(self.__name)
class Responsor(QObject):
def do_nameChanged(self, name):
print("Hello,"+name)
@pyqtSlot(int)
def do_ageChanged_int(self, age):
print("你的年龄是:"+str(age))
@pyqtSlot(str)
def do_ageChanged_str(self, ageInfo):
print(ageInfo)
if __name__=="__main__":
print("**创建对象时**")
star=Human("张三", 13)
resp = Responsor()
star.nameChanged.connect(resp.do_nameChanged)
star.ageChanged.connect(resp.do_ageChanged_int)
star.ageChanged[str].connect(resp.do_ageChanged_str)
print("\n **建立连接后**")
star.setName("李四")
star.setAge(75)
star.nameChanged.disconnect(resp.do_nameChanged)
star.ageChanged[str].disconnect(resp.do_ageChanged_str)
print("\n **断开name连接和age的str连接,age的int连接保留后**")
star.setName("王五")
star.setAge(35)
对代码的解释
建立连接后,当变量 self.__name 发生变化时发射了 nameChanged 信号,并且
传递了参数 self.__name
def setName(self, name):
self.__name=name
self.nameChanged.emit(self.__name)
这个信号关联了下列槽函数
star.nameChanged.connect(resp.do_nameChanged)
以下函数的运行产生了以上的输出
断开连接后,无法产生输出了。所以对高叶的 hello 看不到。
class Responsor(QObject):
def do_nameChanged(self, name):
print("Hello,"+name)
注意: overload 的信号如果都定义了槽函数,两个槽函数不能同名,连接时需要给信号加参数区分
star.ageChanged.connect(resp.do_ageChanged_int)
star.ageChanged[str].connect(resp.do_ageChanged_str)
断开连接
star.nameChanged.disconnect(resp.do_nameChanged)
star.ageChanged[str].disconnect(resp.do_ageChanged_str)
输出结果
创建对象时虽然也发射信号,但还未建立关联,所以无响应
建立关联后,3 个信号的槽函数都响应了。我们看到了三行输出。
断开关联后,断开管理的槽函数无响应了。所以只有没断开的 int 类型槽函数还有输出。