PyQt学习------PyQt自定义信号

使用自定义信号,需要使用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

对代码的解释

建立连接后,当变量 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)

输出结果

PyQt学习------PyQt自定义信号_第1张图片

创建对象时虽然也发射信号,但还未建立关联,所以无响应
建立关联后,3 个信号的槽函数都响应了。我们看到了三行输出。
断开关联后,断开管理的槽函数无响应了。所以只有没断开的 int 类型槽函数还有输出。

 

你可能感兴趣的:(pyqt学习,pyqt,学习)