PyQt5学习笔记16----PyQt信号和槽传递额外参数

2023-10-30

使用Pyqt编程过程中,经常会遇到给槽函数传递额外参数的情况。但是信号-槽机制只是指定信号如何连接到槽,信号定义的参数被传递给槽,而额外的参数(用户定义)不能直接传递。

而传递额外参数又是很有用处。你可能使用一个槽处理多个组件的信号,有时要传递额外的信息。


一种方法是使用lambda表达式。

[python]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. from PyQt4.QtCore import *  
  2. from PyQt4.QtGui import *  
  3.   
  4. class MyForm(QMainWindow):  
  5.     def __init__(self, parent=None):  
  6.         super(MyForm, self).__init__(parent)  
  7.         button1 = QPushButton('Button 1')  
  8.         button2 = QPushButton('Button 1')  
  9.         button1.clicked.connect(lambdaself.on_button(1))  
  10.         button2.clicked.connect(lambdaself.on_button(2))  
  11.   
  12.         layout = QHBoxLayout()  
  13.         layout.addWidget(button1)  
  14.         layout.addWidget(button2)  
  15.   
  16.         main_frame = QWidget()  
  17.         main_frame.setLayout(layout)  
  18.   
  19.         self.setCentralWidget(main_frame)  
  20.   
  21.     def on_button(self, n):  
  22.         print('Button {0} clicked'.format(n))  
  23.   
  24. if __name__ == "__main__":  
  25.     import sys  
  26.     app = QApplication(sys.argv)  
  27.     form = MyForm()  
  28.     form.show()  
  29.     app.exec_()  



解释一下,on_button是怎样处理从两个按钮传来的信号。我们使用lambda传递按钮数字给槽,也可以传递任何其他东西---甚至是按钮组件本身(假如,槽打算把传递信号的按钮修改为不可用)


第2个方法是使用functools里的partial函数。

[python]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. button1.clicked.connect(partial(self.on_button, 1))  
  2. button2.clicked.connect(partial(self.on_button, 2))  


哪个办法好一点?这个属于风格的问题。个人观点,喜欢lambda,条理清楚,而且灵活。


《Rapid GUI Program with Python and QT》 P143例子。



[python]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. from PyQt4.QtCore import *  
  2. from PyQt4.QtGui import *  
  3. from functools import partial  
  4. import sys  
  5.   
  6. class Bu1(QWidget):  
  7.     
  8.     def __init__(self, parent=None):  
  9.         super(Bu1, self).__init__(parent)  
  10.         #水平盒式布局  
  11.         layout = QHBoxLayout()  
  12.         #显示  
  13.         self.lbl = QLabel('no button is pressed')  
  14.         #循环5个按钮  
  15.         for i in range(5):  
  16.             but = QPushButton(str(i))  
  17.             layout.addWidget(but)  
  18.             #信号和槽连接  
  19.             but.clicked.connect(self.cliked)  
  20.               
  21.         #使用封装,lambda  
  22.         but = QPushButton('5')  
  23.         layout.addWidget(but)  
  24.         but.clicked.connect(lambdaself.on_click('5'))  
  25.         #使用个who变量,结果不正常,显示 False is pressed  
  26.         #but.clicked.connect(lambda who="5": self.on_click(who))  
  27.           
  28.         #使用封装,partial函数  
  29.         but = QPushButton('6')  
  30.         layout.addWidget(but)  
  31.         but.clicked.connect(partial(self.on_click, '6'))  
  32.           
  33.         layout.addWidget(self.lbl)  
  34.         #设置布局  
  35.         self.setLayout(layout)  
  36.           
  37.     #传递额外参数     
  38.     def cliked(self):  
  39.         bu = self.sender()  
  40.         if isinstance(bu, QPushButton):  
  41.             self.lbl.setText('%s is pressed' % bu.text())  
  42.         else:  
  43.             self.lbl.setText('no effect')  
  44.     def on_click(self, n):  
  45.         self.lbl.setText('%s is pressed' % n)  
  46.               
  47. if __name__ == '__main__':          
  48.     app = QApplication(sys.argv)  
  49.     bu =Bu1()  
  50.     bu.show()  
  51.     app.exec_()  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt5学习笔记16----PyQt信号和槽传递额外参数 的相关文章

随机推荐

  • 【React + Umi】自定义离开页面拦截弹框事件

    在 react umi 中对离开页面的行为进行自定义弹窗拦截控制 以下为可选的方案分析 wrapper 首先 因为项目框架是 umi 最先想到了 umi 路由的 wrapper 装饰器 但仔细一想又不太对 wrapper 争对于跳转到某个特
  • Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库

    字符串类型 string redis的字符串是二进制安全的 什么是二进制安全 简单理解就是存入什么数据取出的还是什么数据 商品编号 订单号采用string的递增数字特性生成 散列类型 hash hash叫散列类型 它提供了字段和字段值的映射
  • VS2008中的ncb、pdb文件分析

    NCB是 No Compile Browser 的缩写 称为 无编译浏览文件 其中存放了供ClassView WizardBar和Component Gallery使用的信息 由VC开发环境自动生成 工程拷来拷去都会生成新的信息以适应新的环
  • 【python】CodingGames Shadows of the Knight - Episode 1

    CodingGames 之 蝙蝠侠救人 描述 你是蝙蝠侠 你将通过使用你的抓斗枪从一个窗口跳到另一个窗口来寻找给定建筑物上的人质 您的目标是跳到人质所在的窗口以解除炸弹的武装 不幸的是 在炸弹爆炸之前你的跳跃次数是有限的 在每次跳跃之前 热
  • 经验:在Maven项目中,打包时指定 main class 的配置(亲测有效)

    Maven打包的时候 是不是经常会出现 没有主清单属性 的报错 以下的配置 放在 pom xml 最后的 lt build gt 中 就能自定义main函数所在的类 然后打包了
  • 谷歌、OpenAI等警告:BERT、GPT-3等大型语言模型都有一个重大缺陷,很危险...

    2020 12 17 00 14 54 作者 青暮 语言模型已经变得越来越强大 可胜任的任务也越来越多 这些仅仅以预测句子中下一个单词进行训练的模型 已经在诸如问答 翻译等应用程序中取得了突破性的进展 前段时间在社交媒体上活跃异常的GPT
  • 《消息队列高手课》主题和队列有什么区别?

    如果你研究过超过一种消息队列产品 你可能已经发现 每种消息队列都有自己的一套消息模型 像队列 Queue 主题 Topic 或是分区 Partition 这些名词概念 在每个消息队列模型中都会涉及一些 含义还不太一样 为什么出现这种情况呢
  • Service Intent must be explicit的解决方法

    http blog csdn net shenzhonglaoxu article details 42708723 java view plain copy final Intent intent new Intent intent se
  • jeesite框架中获取登入用户的登入名

    jeesite框架中获取登入用户的登入名 UserUtils getUserName
  • 17 张图实战 + 理清 K8S 网络排错思路,硬核!

    作者 Cylon出处 https u kubeinfo cn R35JNc Overview 本文将引入一个思路 在 Kubernetes 集群发生网络异常时如何排查 文章将引入 Kubernetes 集群中网络排查的思路 包含网络异常模型
  • 算法笔记之旅——问题B:出租车费

    题目描述 某市出租车计价规则如下 起步4公里10元 即使你的行程没超过4公里 接下来的4公里 每公里2元 之后每公里2 4元 行程的最后一段即使不到1公里 也当作1公里计费 一个乘客可以根据行程公里数合理安排坐车方式来使自己的打车费最小 例
  • 空间误差分析:统一的应用导向处理(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 本文关
  • SVN软件中patch的的运用以及patch介绍

    什么是patch patch就是补丁 在程序中就是和原来相比有差异的部分 生活中常见的就是程序升级 假设我们用手机下载某个软件显示是100M大小 第一次安装时就需要下载100M大小的安装包 当安装完成后 后续会收到软件升级的提醒 升级包可能
  • Vuforia提高识别图星级

    本文转载自http blog csdn net unity3d xyz article details 50638007 高通的识别图上传到后台以后我们可以看有星级评定 星值最大为5星 星值越大有以下好处 1 识别图越容易识别 2 识别出来
  • 从零开始的RVOS: Referring Video Object Segmentation

    最近新接触到一个与VOS相关的任务 叫做Referring VOS 该任务基于文本描述对视频中特定目标进行分割 是一个新兴的跨模态CV任务 数据集 1 静态推断图像分割数据集 虽然RVOS是视频任务 但根据以往的经验和相关文章的方法 可以使
  • 水文模型有哪些?SWAT模型、VIC模型、HEC模型、HSPF模型、HYPE模型、SWMM模型、FVCOM模型、Delft3D模型等应用

    目录 从小白到精通SWAT模型学习建模方法 实例应用 高级进阶 R VIC模型融合实践技术应用及未来气候变化模型预测 HEC RAS一维 二维建模方法及实践技术应用 HEC HMS水文模型实践技术应用 HSPF 模型应用 HYPE分布式水文
  • Service的两种启动方式

    在Android开发的过程中 Service是一个非常重要的组件 它的生命周期里面有几个特别重要的方法 Service的生命周期 onCreate 当服务创建的时候调用 onStartCommand startServcie的时候会调用这个
  • RFID作业(第三次)

    1 通信系统中为什么要进行编码和解码 常见的编码方法有哪些 信源编码是指将模拟信号转换成数字信号 或将数字信号编码成更合适传输的数字信号 换句话来说 通信系统编码和解码是为了让信号更适合传输 常见的编码方法有1 反向不归零编码 2 曼彻斯特
  • ListView的复用问题,点击条目变色.不复用

    主要的是3个类 包含activity application 和一个adpter 内部的细节在代码中都有详细的注释 可以参考 application public class MyApplication extends Applicatio
  • PyQt5学习笔记16----PyQt信号和槽传递额外参数

    使用Pyqt编程过程中 经常会遇到给槽函数传递额外参数的情况 但是信号 槽机制只是指定信号如何连接到槽 信号定义的参数被传递给槽 而额外的参数 用户定义 不能直接传递 而传递额外参数又是很有用处 你可能使用一个槽处理多个组件的信号 有时要传