第二章 关于overload型信号和自定义信号使用示例

import sys
from PyQt5.QtCore import QObject,pyqtSlot,pyqtSignal

class Human(QObject):
    nameChanged=pyqtSignal(str)
    # nameChanged信号是带有一个str类型参数的信号
    ageChanged=pyqtSignal([int],[str])
    # ageChanged信号是具有两种类型参数的overload型的信号,类型可以是str,或是int型
    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)
        # 通过信号的emit()函数发射信号。在类的某个状态发生变化,需要通知外部发生了这种变化时,发射相应的信号。
        # 如果信号关联了一个槽函数,就会执行槽函数。如果未关联,则不会产生任何反应。
        # 例如在Human.setName()函数中,当变量self.__name发生变化时,发射nameChanged信号,并且传递参数。
        # 即:self.nameChanged.emit(self.__name),其中变量self.__name作为信号的参数,关联的槽函数可以从参数中获取当前信号的名称,
        # 从而进行相应的处理。
        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参数信号
        # Human.setAge()函数中发射了两次ageChanged信号,但是使用了不同的参数,分别是int参数和str参数
        # 即:self.ageChanged.emit(self.__age)
        #    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("你的年龄是:"+str(age))

    @pyqtSlot(str)
    def do_ageChanged_str(self,ageInfo):
        print(ageInfo)
## 在信号对应的方法中,因为信号ageChanged有两种参数类型,同时需要和两种参数都建立连接,采用两个槽函数类型不同的方法,
## 即:do_ageChanged_int,do_ageChanged_str
## @pyqtSlot说明槽函数的数据类型,使得信号和槽之间能够正确关联。比如:PyQt5中的overload类型的信号,一般只为其中的一种信号编写槽函数。
##  @pyqtSlot(str)
    def do_nameChanged(self,name):
        print("Hello",+name)



# Press the green button in the gutter to run the script.
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类型
    ## ageChanged信号默认参数类型为int型,对于另外一个非默认参数为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信号

解释在代码的注释中。

Override和Overload是Java中的两个概念,它们都与方法相关。 Override(重写)是指在子类中重新定义父类的方法,以便修改或扩展其行为。重写发生在继承关系中,子类必须具有与父类相同的方法名、参数列表和返回类使用@Override注解可以让编译器帮助检查是否进行了正确的重写。 Overload(重载)是指在同一个类中,方法名相同但参数列表不同的多个方法。重载与返回值和修饰词无关,主要根据方法的参数个数、类或顺序来区分。重载可以发生在同一个类中,与继承无关。 总结来说,Override是子类对父类方法的重新定义,而Overload是在同一个类中对方法进行多个版本的定义,以便处理不同的参数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [方法的覆盖(override)与 方法的重载(overload)](https://blog.csdn.net/weixin_42131843/article/details/105001234)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [重载(Overload)与重写(Override)的区别](https://blog.csdn.net/weixin_52754604/article/details/122968798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java overload和override的区别分析](https://download.csdn.net/download/weixin_38647822/12817182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值