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

简介: 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<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 类型槽函数还有输出。


目录
相关文章
|
1天前
|
调度 Python
Python多线程学习优质方法分享
Python多线程学习优质方法分享
|
1天前
|
SQL 小程序 数据库连接
【Python学习】Python基础必背的内容
【Python学习】Python基础必背的内容
14 1
|
3天前
|
Python
Python深入学习教程
Python深入学习教程
|
3天前
|
JavaScript PHP 网络架构
Python学习技巧及方法总结
Python学习技巧及方法总结
|
9天前
|
Python
GitHub爆赞!终于有大佬把《Python学习手册》学习笔记分享出来了
这份笔记的目标是为了给出一份比较精炼,但是又要浅显易懂的Python教程。《Python学习手册》中文第四版虽然比较简单,但是措辞比较罗嗦,而且一个语法点往往散落在多个章节,不方便读者总结。 我在做笔记时,将一个知识点的内容都统筹在一个章节里面,因此提炼性大大提高。而且还有《Python学习手册》中文第四版的翻译在某些章节(可能难度较大?)措辞可能前后矛盾。当知识点提炼之后就能够很快的找到一些难以理解的概念的上下文,方便吃透这些难点。
GitHub爆赞!终于有大佬把《Python学习手册》学习笔记分享出来了
这份笔记的目标是为了给出一份比较精炼,但是又要浅显易懂的Python教程。《Python学习手册》中文第四版虽然比较简单,但是措辞比较罗嗦,而且一个语法点往往散落在多个章节,不方便读者总结。 我在做笔记时,将一个知识点的内容都统筹在一个章节里面,因此提炼性大大提高。而且还有《Python学习手册》中文第四版的翻译在某些章节(可能难度较大?)措辞可能前后矛盾。当知识点提炼之后就能够很快的找到一些难以理解的概念的上下文,方便吃透这些难点。
|
18天前
|
机器学习/深度学习 人工智能 数据挖掘
从零开始学习Python编程语言
本文将介绍Python编程语言的基础知识和学习路径,帮助初学者快速入门,并为进阶学习提供指引。首先,我们将讨论Python的特点和应用领域,然后深入探讨Python的基础语法、常用数据类型和控制流程,最后介绍如何利用Python进行简单的编程实践。
|
20天前
|
数据处理 索引 Python
【Python学习篇】Python实验小练习——文件操作(十一)
【Python学习篇】Python实验小练习——文件操作(十一)
31 1
|
20天前
|
存储 Python Windows
【Python学习篇】Python实验小练习——函数(十)
【Python学习篇】Python实验小练习——函数(十)
10 1
|
20天前
|
存储 Python
【Python学习篇】Python——函数(九)
【Python学习篇】Python——函数(九)
14 1