PyQt5-自定义信号的使用

信号与槽的一些特点和功能

在PyQt5中,信号与槽的使用有如下一些特点。
· 一个信号可以关联多个槽函数。
· 一个信号也可以关联其他信号。
· 信号的参数可以是任何Python数据类型。
· 一个槽函数可以和多个信号关联。
· 关联可以是直接的(同步)或排队的(异步)。
· 可以在不同线程之间建立关联。· 信号与槽也可以断开关联。

上节的示例使用的信号都是类的内建信号,在自定义类中还可以自定义信号。

使用自定义信号在程序的对象之间传递信息是非常方便的,例如在多窗体应用程序中,通过信号与槽在窗体之间传递数据。

使用PyQt5.QtCore.pyqtSignal()为一个类定义新的信号。要自定义信号,类必须是QObject类的子类。pyqtSignal()的句法是:

image

信号可以带有参数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信号

image

image

image

使用信号与槽的一些注意事项

image

posted @ 2021-06-26 13:04  司砚章  阅读(224)  评论(0编辑  收藏  举报