PyQt5中重要的概念:信号与槽

PyQt中信号与槽概念定义如下(网络上引用的):

信号(signal)和槽(slot)是Qt的核心机制,也是在PyQt编程中对象之间进行通信的机制。在创建事件循环之后,通过建立信号和槽的连接就可以实现对象之间的通信。当信号发射(emit)时,连接的槽函数将会自动执行。

所谓内置信号与槽的使用。是指在发射信号时,使用窗口控件的函数,而不是自定义的函数。信号与槽的连接方法是通过QObject.signal.connect将一个QObject的信号连接到另一个QObject的槽函数。

信号与槽有三种使用方法,第一种是内置信号与槽的使用,第二种是自定义信号与槽的使用,第三种是装饰器的信号与槽的使用。

在这里插入图片描述

python 装饰器详解
【Python】*args**kwargs的用法【最全详解】

官方网站:PyQt API中信号与槽详细解释

内置信号与槽的使用

参考文章:Python Qt GUI设计:信号与槽的使用方法(基础篇—7)

Qt Designer中提供了一些最基础的信号和槽设置方法,在实际的项目开发中,信号和槽最佳的使用方式是Qt Designer和编程相结合,才能提高开发效率。

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

生成python代码,

在这里插入图片描述

自定义信号与槽的使用

不适用内置信号与槽,而使用自定义信号与槽。自定义信号与槽是指在发射信号时,不使用窗口控件的函数,而是使用自定义的函数(简单地说,就是使用pyqtSignal类实例发射信号)。

在这里插入图片描述

使用方法示例如下:
PyQt5自定义信号与槽带示例讲解
在这里插入图片描述
在这里插入图片描述

关键代码:

设置信号事件:signal_single_link = pyqtSignal(str,str,str) #定义下载单条链接的信号参数(文件名,文件大小,文件进度)

定义槽函数:

def showSingalInfo(self,file_name,file_size,file_progress):self.label_txt_path.setText('文件名:'+file_name+'文件大小:'+file_size+'文件进度:'+file_progress)

使用connect()函数,绑定槽函数:self.signal_single_link.connect(self.showSingalInfo)

发送信号给槽,使用emit()函数:self.signal_single_link.emit(str(name),str(file_size),str(formatFloat§))

上述自定义信号与绑定槽操作的作用是下载过程中(单开一个线程实现下载过程),传进度返回给主线程(UI主界面是主线程)中的label控件显示
在这里插入图片描述
在这里插入图片描述

使用装饰器pyqtSlot定义信号与槽

官方网站:PyQt API中信号与槽详细解释

@pyqtSlot()有两种使用情况。文章:PyQt5 随笔:信号与槽的两种使用方法:@pyqtSlot() 和 connect()

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

@pyqtSlot()是这种方式的修饰关键词,他表明下面函数是信号槽函数

在这里插入图片描述

一个控件同时要写多个信号与槽函数时,只需要写一遍@pyqtSlot()关键词,中间可以有其他函数隔开。

在这里插入图片描述

引用自文章:PyQt 5信号与槽的几种高级玩法

PyQt5 连接信号与自定义槽函数,解决槽函数重复执行的问题

Qt for Python 信号和槽的使用详解,比较好理解使用装饰器生成信号事件的文章,但文章是使用PySide2来写 Qt 程序。

在这里插入图片描述

有的读者可能注意到,我们一直没有解释下面这行代码的含义:

QMetaObject.connectSlotsByName(QObject)
事实上,它是在PyQt 5中根据信号名称自动连接到槽函数的核心代码。通过前面章节中的例子可以知道,使用pyuic5命令生成的代码中会带有这么一行代码,接下来对其进行解释。

这行代码用来将QObject中的子孙对象的某些信号按照其objectName连接到相应的槽函数。这句话读起来有些拗口,这里举个例子进行简单说明。以上面例子中的代码为例:

假设代码QtCore.QMetaObject.connectSlotsByName(self)已经执行,则下面的代码:

@QtCore.pyqtSlot()    
def on_okButton_clicked(self):print( "单击了OK按钮")

会被自动识别为下面的代码(注意,函数中去掉了on,因为on会受到connectSlotsByName的影响,加上on运行时会出现问题):

def __init__(self, parent=None):self.okButton.clicked.connect(self.okButton_clicked)
def okButton_clicked(self):print("单击了OK按钮")

信号与槽的断开与连接

使用disconnect()函数可以解除信号与槽函数的绑定。

from PyQt5.QtCore import QObject , pyqtSignalclass SignalClass(QObject):# 声明无参数的信号signal1 = pyqtSignal()# 声明带一个int类型参数的信号signal2 = pyqtSignal(int)def __init__(self,parent=None):super(SignalClass,self).__init__(parent)# 将信号signal1连接到sin1Call和sin2Call这两个槽函数self.signal1.connect(self.sin1Call)self.signal1.connect(self.sin2Call)# 将信号signal2连接到信号signal1self.signal2.connect(self.signal1)# 发射信号self.signal1.emit()self.signal2.emit(1)# 断开signal1、signal2信号与各槽函数的连接self.signal1.disconnect(self.sin1Call)self.signal1.disconnect(self.sin2Call)self.signal2.disconnect(self.signal1)# 将信号signal1和signal2连接到同一个槽函数sin1Callself.signal1.connect(self.sin1Call)self.signal2.connect(self.sin1Call)# 再次发射信号self.signal1.emit()self.signal2.emit(1)def sin1Call(self):print("signal-1 emit")def sin2Call(self):print("signal-2 emit")if __name__ == '__main__':  signal = SignalClass()

运用自定义信号与槽方法的实际场景

运用自定义信号与槽方法的实际场景:信号和槽一般用于多个窗口之间传递信息, 或者前后端传递信息。

参考文章:大爽pyqt5笔记&教程 三 信号和槽 Signals & Slots 实现窗口跳转、返回、恢复、传参

使用lambda或者functools中的partial函数实现自定义参数的传递

python 中的functools.partial 使用方法

参考文章:python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例

在这里插入图片描述

import sys
from PyQt5.QtWidgets import *
from functools import partial
class WinForm(QMainWindow):def __init__(self,parent=None):super(WinForm, self).__init__(parent)#实例化两个按钮button1=QPushButton('Button1')button2=QPushButton('Button2')#todo 第一种方法#单击信号关联槽函数,利用Lanbda表达式传递一个参数# button1.clicked.connect(lambda :self.onButtonClick(1))# button2.clicked.connect(lambda :self.onButtonClick(2))##todo 第二种方法button1.clicked.connect(partial(self.onButtonClick, 1))button2.clicked.connect(partial(self.onButtonClick, 2))#实例化窗口main=QWidget()#设置窗口的布局,并向其中添加控件layout=QHBoxLayout(main)layout.addWidget(button1)layout.addWidget(button2)#设置为中央控件self.setCentralWidget(main)def onButtonClick( self,n ):#弹窗信息提示框,输出被点击的信息print("Button {0}".format(n))QMessageBox.information(self,'信息提示框','Button {0}'.format(n))
if __name__ == '__main__':app=QApplication(sys.argv)form=WinForm()form.show()sys.exit(app.exec_())

在这里插入图片描述
代码分析

重点解释

使用lambda表达式传递按钮数字给槽函数,当然还可以传递其他东西,甚至是按钮本身

button1.clicked.connect(lambda :self.onButtonClick(1))

button2.clicked.connect(lambda :self.onButtonClick(2))

另一种方法是使用functools中的partial函数

button1.clicked.connect(partial(self.onButtonClick, 1))

button2.clicked.connect(partial(self.onButtonClick, 2))

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

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

相关文章

3W 1.5KVDC 3KVDC 隔离宽范围输入,单、双输出 DC/DC 电源模块——TP2L-3W 系列

TP2L-3W系列是一款高性能、超小型的电源模块,宽范围2:1,4:1输入,输出有稳压和连续短路保护功能,隔离电压为1.5KVDC、3KVDC工作温度范围为–40℃到85℃。特别适合对输出电压的精度有严格要求的地方,外部遥控功能对您的设计又多一项…

AIGC绘画辅助网站

Midjourney风格样式 Midjourney Style Classifier | Andrei Kovalevs Midlibrary

Python-VBA函数之旅-property函数

目录 一、property函数的常见应用场景 二、property函数使用注意事项 三、如何用好property函数? 1、property函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页:神奇夜光杯-CSDN博客 一、prop…

Django 4.x 智能分页get_elided_page_range

Django智能分页 分页效果 第1页的效果 第10页的效果 带输入框的效果 主要函数 # 参数解释 # number: 当前页码,默认:1 # on_each_side:当前页码前后显示几页,默认:3 # on_ends:首尾固定显示几页&#…

多对多字段,执行aerich migrate命令报错

报错状态: 解决: 目前只知道通过修改源码的方式进行更改

【牛客】【模板】差分

原题链接:登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 差分模板。 b[0]a[0]; b[1]a[1]-a[0]; b[2]a[2]-a[1]; ...... b[n-1]a[n-1]-a[n-2]; b[n]a[n]-a[n-1]; 差分标记:b[l]k,b…

一部手机实现全行业的AI实景自动无人直播软件:为商家提供更便捷的推广方式

随着人工智能技术的快速发展,AI实景自动无人直播软件成为了商家推广产品的新宠。这款软件结合了智能讲解、一键开播、智能回复等多项功能,为商家提供了一种全新的直播方式。 首先,智能讲解功能让专业主播录制直播脚本,并通过软件自…

计划订单转采购申请的增强点和可以增强的内容

MD15 MD14 计划订单转采购申请,涉及的增强点和增强内容 对于外协的采购申请,有时候需要对组件的内容做一些特殊的处理,但是处理组件清单的增强ME_COMPONENTS_UPDATE的增强点(这个增强点对于手工创建的外协PR、外协PO,外协pr转外协…

【负载均衡在线OJ项目日记】编译与日志功能开发

目录 日志功能开发 常见的日志等级 日志功能代码 编译功能开发 创建子进程和程序替换 重定向 编译功能代码 日志功能开发 日志在软件开发和运维中起着至关重要的作用,目前我们不谈运维只谈软件开发;日志最大的作用就是用于故障排查和调试&#x…

DBCO-PEG-DBCO,聚乙二醇双二苯基环辛炔可以用于功能化修饰生物材料的表面

【试剂详情】 英文名称 DBCO-PEG-DBCO 中文名称 二苯基环辛炔-聚乙二醇-二苯基环辛炔, 聚乙二醇双二苯基环辛炔 外观性状 由分子量决定,粘稠液体或者固体。 分子量 0.4k,0.6k,1k,2k,3.4k&#xff0c…

F.softmax(cls) + 1e-4

这个代码段中的 softmax 操作结合了一个微小的常数,这个常数通常被称为平滑化参数。softmax 函数将原始的分类输出转换为概率分布,其公式如下: 在实践中,当某些分类得分特别大时,softmax 函数会将对应的概率接近于 1&a…

【C++】C++11--- 类的新功能

目录 类的新功能 默认成员函数 示例 类成员变量初始化 强制生成默认函数的关键字default 禁止生成默认函数的关键字delete 类的新功能 默认成员函数 构造函数析构函数拷贝构造函数拷贝赋值重载取地址重载const取地址重载 C11在原先的6个默认成员函数的基础上&#xff0c…

Baidu Comate:你的智能编程伙伴,编程界的AI革命者

文章目录 Baidu Comate 介绍Baidu Comate下载安装Baidu Comate 实操体验代码解释函数注释行间注释调优建议生成单测注释生成实时续写常用快捷方式智能对话问答 Baidu Comate 建议改进Baidu Comate 体验总结 Baidu Comate 介绍 Baidu Comate 智能编码助手 是基于文心大模型&…

【工作记录】openjdk-22基础镜像的构建

背景 近期使用到的框架底层都用的是springboot3.0,要求jdk版本在17甚至更高。 于是决定制作一个基于openjdk22的基础镜像,本文对这一过程进行记录。 作为记录的同时也希望能够帮助到需要的朋友。 期望效果 容器内可以正常使用java相关命令且版本是2…

浅谈操作系统中的重要概念——线程(3)——设计模式

文章目录 一、什么是设计模式?二、单例模式2.1、饿汉模式2.2、懒汉模式2.3、多线程情况下调用 饿汉模式与懒汉模式 谁是安全的??(重点) 三、工厂模式 一、什么是设计模式? 设计模式就相当于菜谱&#xff0…

30万买智驾车,选特斯拉还是华为?

文 | AUTO芯球 作者 | 雷歌 我真是佩服马斯克, 一趟24小时的北京出差,就解除了Model车系进入机关单位禁令的问题, 也打开了特斯拉FSD完全自动驾驶进入中国市场的大门, 给我我一天时间,估计一部剧都追不完&#xf…

贡献思维,CF1644E. Expand the Path

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1644E - Codeforces 二、解题报告 1、思路分析 很容易想明白被…

暗区突围pc端资格发放了吗 暗区突围pc测试资格怎么获取

暗区突围pc端资格发放了吗 暗区突围pc测试资格怎么获取 暗区突围是一款很火爆的第一人称射击网游,现在终于要上线PC端啦!小伙伴们是不是已经迫不及待想要体验电脑上的硬核射击快感了?暗区突围pc端资格已经陆续发放,想要参与PC端…

Adobe-Premiere-CEP 扩展 入门-视频剪辑-去气口插件-Silence Remover

短视频,这两年比较火,不要再问为什么用Premiere,非常难用,为什么不用某影,某些国内软件非常接地气简单,又例如某音资深的视频短编辑就很好用了。。。 Premiere二次开发调试难,不如自己搞个cons…