使用自定义信号,需要使用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 类型槽函数还有输出。