PyQt5 自定义信号使用示例

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)

    def setName(self, name):
        self.__name = name
        self.nameChanged.emit(self.__name)


class Responsor(QObject):
    @pyqtSlot(int)
    def do_ageChanged_int(self, age):
        print(f'你的年龄是{age}')

    @pyqtSlot(str)
    def do_ageChanged_str(self, ageInfo):
        print(ageInfo)

    # @pyqtSlot(str)
    def do_nameChanged(self, name):
        print(f'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)  # 发射2个ageChanged信号
    boy.setName('Jack')  # 发射nameChanged信号

    boy.ageChanged[str].disconnect(resp.do_ageChanged_str)  # 断开连接
    print('\n**断开ageChanged[str]关联后**')
    boy.setAge(10)  # 发射2个ageChanged信号

**创建对象时**

**建立关联后**
你的年龄是35
你是年轻人
Hello Jack

**断开ageChanged[str]关联后**
你的年龄是10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值