【python】PyQt5信号与槽原理剖析与应用实战

news2024/11/19 0:34:19

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战
景天的主页:景天科技苑

文章目录

  • PyQt5信号与槽
    • 信号与槽介绍
    • 信号与槽机制解读
    • 信号处理API与应用场景
    • destroyed信号
    • objectNameChanged信号
    • disconnect信号
    • widget.blockSignals(bool)
    • widget.signalsBlocked()
    • widget.receivers(信号)
    • 信号处理综合案例

PyQt5信号与槽

信号与槽介绍

信号(Signal)与槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制。PyQt的窗口控件类有很多内置信号,开发者也可以添加自定义信号。信号与槽有如下特点:

一个信号可以连接多个槽。
一个信号可以连接另一个信号。
信号参数可以使任何Python类型。
一个槽可以连接到多个信号。
信号与槽的连接方式可以是同步连接,也可以是异步连接。
信号与槽的连接可能会跨线程。
信号可以断开连接。

信号与槽机制解读

在这里插入图片描述
在这里插入图片描述

信号处理API与应用场景

在这里插入图片描述

PyQt5内置的一些信号
在这里插入图片描述

destroyed信号

当监听到对象销毁时触发槽函数

from PyQt5.Qt import *

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QObject的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):

        self.QObject信号的操作()


    def QObject信号的操作(self):
        self.obj = QObject()
        # obj.destroyed
        # obj.objectNameChanged
        #槽函数的参数用来接收对象,用来表明哪个对象被释放了
        def destroy_cao(obj):
            print("对象被释放了", obj)

        #内置信号destroyed,释放信号
        self.obj.destroyed.connect(destroy_cao)

        del self.obj


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)

    window = Window()

    window.show()

    sys.exit(app.exec_())

运行
在这里插入图片描述

objectNameChanged信号

当监听到对象名发生了改变时触发

def QObject信号的操作(self):
    self.obj = QObject()



    #槽函数可以接收参数,此时的参数是改变后的ObjectName
    def obj_name_cao(name):
        print("对象名称发生了改变", name)

    def obj_name_cao2(name):
        print("对象名称发生了改变2", name)

    self.obj.objectNameChanged.connect(obj_name_cao)
    self.obj.objectNameChanged.connect(obj_name_cao2)

    #改变ObjectName
    self.obj.setObjectName("xxx")

运行,两个槽函数都被触发
在这里插入图片描述

disconnect信号

取消链接信号与槽
当我们设置了两次objectname改变,槽函数会执行两次
在这里插入图片描述

在第二次改变之前,我们使用disconnect。
我们发现,第二次信号没有触发槽的执行
在这里插入图片描述

def QObject信号的操作(self):
    self.obj = QObject()



    #槽函数可以接收参数,此时的参数是改变后的ObjectName
    def obj_name_cao(name):
        print("对象名称发生了改变", name)

    def obj_name_cao2(name):
        print("对象名称发生了改变2", name)

    self.obj.objectNameChanged.connect(obj_name_cao)
    self.obj.objectNameChanged.connect(obj_name_cao2)

    #改变ObjectName
    #当我们设置了两次objectname改变,槽函数会执行两次
    self.obj.setObjectName("xxx")
    #当我们使用disconnect,取消了信号与槽的连接,ObjectName发生快乐改变,也不会触发槽函数的执行
    self.obj.objectNameChanged.disconnect()
    self.obj.setObjectName("xxoo")

widget.blockSignals(bool)

通过传递的布尔参数,可以临时(阻断/恢复)指定控件所有的信号与槽的连接
传递True,表示临时阻断信号与槽的连接
传递False,表示临时恢复信号与槽的连接

def QObject信号的操作(self):
    self.obj = QObject()



    #槽函数可以接收参数,此时的参数是改变后的ObjectName
    def obj_name_cao(name):
        print("对象名称发生了改变", name)

    def obj_name_cao2(name):
        print("对象名称发生了改变2", name)

    self.obj.objectNameChanged.connect(obj_name_cao)
    self.obj.objectNameChanged.connect(obj_name_cao2)

    #改变ObjectName
    #当我们设置了两次objectname改变,槽函数会执行两次
    self.obj.setObjectName("xxx")
    #当我们使用disconnect,取消了信号与槽的连接,ObjectName发生快乐改变,也不会触发槽函数的执行
    # self.obj.objectNameChanged.disconnect()

    #通过blockSignals(True)阻断信号与槽连接,下面的信号未触发槽函数执行
    self.obj.blockSignals(True)
    self.obj.setObjectName("xxoo")

信号被阻断后,第二个槽函数未执行
在这里插入图片描述

obj.blockSignals(False)
继续保持信号与槽的连接
在这里插入图片描述

widget.signalsBlocked()

获取信号是否被阻止,被阻止返回True,没被组织返回False

def QObject信号的操作(self):
    self.obj = QObject()
    #槽函数可以接收参数,此时的参数是改变后的ObjectName
    def obj_name_cao(name):
        print("对象名称发生了改变", name)

    def obj_name_cao2(name):
        print("对象名称发生了改变2", name)

    self.obj.objectNameChanged.connect(obj_name_cao)
    self.obj.objectNameChanged.connect(obj_name_cao2)

    #改变ObjectName
    #当我们设置了两次objectname改变,槽函数会执行两次
    self.obj.setObjectName("xxx")
    #当我们使用disconnect,取消了信号与槽的连接,ObjectName发生快乐改变,也不会触发槽函数的执行
    # self.obj.objectNameChanged.disconnect()



    #通过blockSignals(True)阻断信号与槽连接,下面的信号未触发槽函数执行
    self.obj.blockSignals(True)

    #获取信号是否被阻止
    print("信号是否被阻止",self.obj.signalsBlocked())

    #继续保持信号与槽的连接
    # self.obj.blockSignals(False)
    self.obj.setObjectName("xxoo")

在这里插入图片描述

widget.receivers(信号)

查看信号连接槽的数量

print("信号连接槽的数量",self.obj.receivers(self.obj.objectNameChanged))

在这里插入图片描述

信号处理综合案例

  1. 当用户点击按钮的时候, 打印"点我嘎哈?"
from PyQt5.Qt import *

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QObject的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):


        self.QObject信号的操作()

    def QObject信号的操作(self):
 
        # *************信号与槽案例***************开始
        btn = QPushButton(self)
        btn.setText("点击我")
        def cao():
            print("点我嘎哈?")

        btn.clicked.connect(cao)


        # *************信号与槽案例***************结束

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)

    window = Window()

    window.show()

    sys.exit(app.exec_())

运行
在这里插入图片描述

  1. 在所有修改的窗口标题前, 添加前缀"景天-"
def 信号与槽():
    # 连接窗口标题变化的信号  与  槽
    #通过传递参数获取修改后的标题
    def cao(title):
        # print("窗口标题变化了", title)
        # window.windowTitleChanged.disconnect()
        #设置信号与槽断开,防止出现递归死循环
        window.blockSignals(True)
        window.setWindowTitle("景天-" + title)
        #恢复信号与槽连接,方便后续再次修改时,能触发槽函数
        window.blockSignals(False)
        # window.windowTitleChanged.connect(cao)

    #标题变化信号
    window.windowTitleChanged.connect(cao)

    window.setWindowTitle("Hello Sz")

    # window.setWindowTitle("Hello Sz2")
    # window.setWindowTitle("Hello Sz3")



if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)

    # window = Window()
    #测试信号与槽案例,重新创建个窗口
    window = QWidget()
    信号与槽()

    window.show()

    sys.exit(app.exec_())

运行
在这里插入图片描述

多次修改,也可以

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1867473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型+多模态合规分析平台,筑牢金融服务安全屏障

随着金融市场的快速发展,金融产品和服务日趋多样化,消费者面临的风险也逐渐增加。 为保护消费者权益,促进金融市场长期健康稳定发展,国家监管机构不断加强金融监管,出台了一系列法律法规和政策文件。对于金融从业机构…

基于YOLOv5s的纸板缺陷检测(附数据集与Coovally操作步骤)

本文内容:以纸板缺陷检测为例操作的整个过程,从创建数据集到训练模型再到预测结果每个步骤进行可视化操作与分析。 文末有数据集获取方式,请先看检测效果 现状 物流行业快速发展,对于网购的需求不断增大,随之而来的就是纸板制造…

Linux安装JDk教程

📖Linux安装JDk教程 ✅下载✅安装 ✅下载 官方Oracle地址:https://www.oracle.com/java/technologies/downloads/archive/ 123云盘:https://www.123pan.com/s/4brbVv-JdmWA.html ✅安装 1.上传安装包jdk-17_linux-x64_bin.tar.gz到指定位…

记一次elementui时间线的实现

实现效果 点击展开,每次累加五条数据进行展示 实现思路 起始本质上就是一个分页查询,只不过按新的形式展示,然后也不统计总数,每次只展示固定的5条数据点击加载更多,就展示下一页,页的页数进行1&#xff…

树莓派pico入坑笔记,uart使用

uart原理自行百度,相关内容很多其他博主写过并且质量很高,这里不再赘述。 调用circuitpy的busio模块来使用uart,除此以外,spi、iic等要需要使用该模块,使用方法见 官方教程 ,详细信息见文档 官方的例子简…

Mysql索引的实现原理,B+Tree,WAL

InnoDB 引擎,每一个数据表有两个文件 .frm和.ibd,分别为表结构,数据和索引,数据挂在主索引的叶子节点上,此主索引称为聚簇索引。 MyISAM 引擎,每一个数据表有三个文件.frm和.MYI和.MYD,分别为表…

Docker-compose 实现Prometheus+Grafana监控MySQL及Linux主机

. ├── Grafana │ ├── data │ └── docker-compose.yaml ├── Mysql │ ├── conf │ ├── data │ ├── docker-compose.yaml │ └── logs ├── Mysqld_exporter │ ├── conf │ └── docker-compose.yaml ├── node-exporter │…

使用新H5标签dialog,实现点击按钮显示分享链接弹出层交互功能

使用新H5标签&#xff0c;实现点击按钮显示分享链接弹出层交互功能 在现代网页开发中&#xff0c;使用新技术和标签来提升用户体验是非常重要的。今天&#xff0c;我们就来聊聊如何利用HTML5的<dialog>标签来实现一个简洁实用的分享链接功能。 在过去&#xff0c;我们通常…

golang——Gin框架及路由介绍

一. 框架介绍 Gin是一个轻量级的Go语言Web框架&#xff0c;它具有高性能和简洁的设计。由于其快速的路由匹配和处理性能&#xff0c;Gin成为Go语言中最受欢迎的Web框架之一。 特点&#xff1a; 快速和轻量&#xff1a;Gin框架的设计注重性能和效率&#xff0c;采用了一些优化措…

暗黑4PTR怎么参与测试 暗黑4第五赛季怎么参加PTR测试教程

暗黑破坏神4作为暗黑破坏神系列的最新作品&#xff0c;自从2023年上线就受到了一众好评。游戏是动作冒险类角色扮演游戏&#xff0c;游戏的背景设定在一个腐化的圣休瑞亚大陆上&#xff0c;玩家们可以五种职业中选择自己喜爱的游戏进行游戏。 暗黑破坏神4第五赛季现在已经开启P…

时序约束(一):时钟的约束

目录 一、时钟约束的目的 二、约束工程项目 三、主时钟和生成时钟 四、主时钟约束 五、生成钟约束 一、时钟约束的目的 之前的文章对时序分析的基本原理做了介绍&#xff0c;我们会发现时序分析离不开时钟信号。对于时序分析工具来说同样如此&#xff0c;分析工具需要我…

谈谈你对AQS的理解

AQS概述 AQS&#xff0c;全称为AbstractQueuedSynchronizer&#xff0c;是Java并发包&#xff08;java.util.concurrent&#xff09;中一个核心的框架&#xff0c;主要用于构建阻塞式锁和相关的同步器&#xff0c;也是构建锁或者其他同步组件的基础框架。AQS提供了一种基于FIF…

《mysql》--mysql约束

数据库约束 有的时候数据库中的数据是有一定要求的&#xff0c;有些数据认为是合法数据&#xff0c;有些是非法数据&#xff0c;如果靠人工检查显然是不靠谱的&#xff1b; 数据库会自动的对数据的合法性进行校验检查目的就是&#xff0c;保证数据中能够避免被插入/修改一些非…

刷盘,还是不刷盘,是一个问题 | 架构师之路重启

前几个有个朋友留言&#xff0c;问我说最近两年公号发读书感悟&#xff0c;职场感悟&#xff0c;AI实践居多了&#xff0c;发架构思路类的内容少了。 最近准备重启架构思路类的内容&#xff0c;且会保持一如既往的风格&#xff1a; 1. 希望引发大家思考&#xff0c;多讨论&…

docker安装与入门使用(适用于小白)

总结&#xff1a;Docker 是一个开源的容器化平台&#xff0c;旨在使开发、部署和运行应用程序的过程更加简单和高效。Docker 使用操作系统级虚拟化在单个主机上运行多个独立的容器。每个容器包含应用程序及其所有依赖项&#xff0c;确保在不同环境中具有一致的运行表现。 下面…

贪心算法——加工木棍(C++)

上大学&#xff0c;一天是一天&#xff0c;两天也是一天。 ——2024年6月27日 之前考试周断更了&#xff0c;今天重新开始&#xff01; 题目描述 有n根木棍&#xff0c;已知每根木棍的长度和重量。这些木棍在木工机器上加工&#xff0c;机器准备加工木棍需要一些时间&#xf…

ABB机器人示教器死机时如何重置?

ABB机器人示教器死机时如何重置&#xff1f; 若遇到机器人示教器死机或卡顿现象时&#xff0c;可尝试将示教器重置&#xff0c;具体方法可参考以下内容&#xff1a; 如下图所示&#xff0c;首先将机器人控制柜断电关机&#xff0c; 如下图所示&#xff0c;同时按住快捷键&…

2024年水利工程与交通运输国际学术会议(ICWCET 2024)

全称&#xff1a;2024年水利工程与交通运输国际学术会议(ICWCET 2024) 会议网址: http://www.icwcet.com 会议时间: 2024/6/25 截稿时间&#xff1a;2024/6/15 会议地点: 天津 投稿邮箱&#xff1a;icwcetsub-conf.com 投稿标题&#xff1a;ICWCET 2024ArticleTEL。 ★会议简介…

目标检测系列(二)yolov1的全面讲解

目录 1、网络结构 2、检测原理 3、制作训练正样本方法 4、损失函数 5、前向推理 6、模型缺限 YOLO的全称是you only look once&#xff0c;指只需要浏览一次就可以识别出图中的物体的类别和位置。YOLO被称为Region-free方法&#xff0c;相比于Region-based方法&#xff0…

GNU、Unix、Linux、Makefile、GCC、GDB、GPL、CentOS 7、Ubuntu之间的关系

全文总结 早期&#xff0c;Unix系统作为一类强大的操作系统&#xff0c;在计算领域奠定了基础。然而&#xff0c;出于对软件自由的追求&#xff0c;Richard Stallman在1983年发起了GNU项目&#xff0c;旨在创建一个完全自由的、与Unix兼容的操作系统。GNU项目不仅倡议软件自由…