pyqt信号和槽传递额外参数
转载:fengyu09
环境:python2.7.8 —— pyqt 4.11.1
使用Pyqt编程过程中,经常会遇到给槽函数传递额外参数的情况。但是信号-槽机制只是指定信号如何连接到槽,信号定义的参数被传递给槽,而额外的参数(用户定义)不能直接传递。而传递额外参数又是很有用处。你可能使用一个槽处理多个组件的信号,有时要传递额外的信息。
第1个方法是使用lambda表达式
- from PyQt4.QtCore import *
- from PyQt4.QtGui import *
- class MyForm(QMainWindow):
- def __init__(self, parent=None):
- super(MyForm, self).__init__(parent)
- button1 = QPushButton('Button 1')
- button2 = QPushButton('Button 2')
- button1.clicked.connect(lambda: self.on_button(1))
- button2.clicked.connect(lambda: self.on_button(2))
- layout = QHBoxLayout()
- layout.addWidget(button1)
- layout.addWidget(button2)
- main_frame = QWidget()
- main_frame.setLayout(layout)
- self.setCentralWidget(main_frame)
- def on_button(self, n):
- print('Button {0} clicked'.format(n))
- if __name__ == "__main__":
- import sys
- app = QApplication(sys.argv)
- form = MyForm()
- form.show()
- app.exec_()
解释一下,on_button是怎样处理从两个按钮传来的信号。我们使用lambda传递按钮数字给槽,也可以传递任何其他东西---甚至是按钮组件本身(假如,槽打算把传递信号的按钮修改为不可用)
第2个方法是使用functools里的partial函数。
- button1.clicked.connect(partial(self.on_button, 1))
- button2.clicked.connect(partial(self.on_button, 2))
哪个办法好一点?这个属于风格的问题。个人观点,喜欢lambda,条理清楚,而且灵活。
《Rapid GUI Program with Python and QT》 P143例子。
- from PyQt4.QtCore import *
- from PyQt4.QtGui import *
- from functools import partial
- import sys
- class Bu1(QWidget):
- def __init__(self, parent=None):
- super(Bu1, self).__init__(parent)
- # 水平盒式布局
- layout = QHBoxLayout()
- # 显示
- self.lbl = QLabel('no button is pressed')
- # 循环5个按钮
- for i in range(5):
- but = QPushButton(str(i))
- layout.addWidget(but)
- # 信号和槽连接
- but.clicked.connect(self.cliked)
- # 使用封装,lambda
- but = QPushButton('')
- layout.addWidget(but)
- but.clicked.connect(lambda: self.on_click(''))
- # 使用个who变量,结果不正常,显示 False is pressed
- # but.clicked.connect(lambda who="5": self.on_click(who))
- # 使用封装,partial函数
- but = QPushButton('')
- layout.addWidget(but)
- but.clicked.connect(partial(self.on_click, ''))
- layout.addWidget(self.lbl)
- # 设置布局
- self.setLayout(layout)
- # 传递额外参数
- def cliked(self):
- bu = self.sender()
- if isinstance(bu, QPushButton):
- self.lbl.setText('%s is pressed' % bu.text())
- else:
- self.lbl.setText('no effect')
- def on_click(self, n):
- self.lbl.setText('%s is pressed' % n)
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- bu = Bu1()
- bu.show()
- app.exec_()
pyqt信号和槽传递额外参数的更多相关文章
- Django 传递额外参数及 URL别名
传递额外参数到视图函数中 在 urls.py 文件中添加下面内容 from django.conf.urls import url urlpatterns = [ url(r'index', view ...
- Qt信号与槽传递自定义数据类型——两种解决方法
信号与槽作为qt中的核心机制,在qt应用开发中经常会用的,但是原生的信号与槽连接传参,只支持基本的数据类型,比如char,int, float,double. 如果想要在信号与槽之间传递自定义参数,比 ...
- pyqt信号和槽应用举例
第一篇手写随笔. 项目的部分代码: 在子线程中改变主窗体的标签. class MyForm(QDialog): def __init__(self, parent=None): self.config ...
- MVC 使用 Webuploader 插件 传递额外参数 备忘笔记
// 实例化 uploader = WebUploader.create({ pick: { id: '#filePicker-2', label: '点击选择图片' }, formData: { k ...
- <笔记>TP5的分页传递额外参数
默认生成的分页只有page一个参数,若需要提供额外的参数才能访问分页(例如查询结果的分页,需要传入查询关键字的参数才能显示结果),则需要设置额外参数query
- 关于Qt信号与槽机制的传递方向性研究(结论其实是错误的,但是可以看看分析过程)
最近由于项目的需求,一直在研究Qt.信号与槽机制是Qt的一大特色,该机制允许两者间传递参数,依次来实现对象间的通信.这个参数会分别存在于信号的参数列表和槽函数的参数列表中.需要注意的是,若将槽函数绑定 ...
- Qt带参数的信号和槽
在Qt的开发过程中,信号带参数是很常见的,在使用带参数的信号槽时,有以下几点需要注意. 当信号和槽函数的参数数量相同时,它们的参数类型要完全一致. 信号和槽函数的声明: signals: void i ...
- Django---路由系统,URLconf的配置,正则表达式的说明(位置参数),分组命名(捕获关键字参数),传递额外的参数给视图,命名url和url的反向解析,url名称空间
Django---路由系统,URLconf的配置,正则表达式的说明(位置参数),分组命名(捕获关键字参数),传递额外的参数给视图,命名url和url的反向解析,url名称空间 一丶URLconf配置 ...
- QT从入门到入土(三)——信号和槽机制
摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...
随机推荐
- 51Nod 1459:迷宫游戏(最短路)
1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...
- Spark各个版本新特性
后续会添加spark生态系统中各个组件的兼容支持情况... Spark2.0.0 * 2016-07-27正式发布 * 它是2.x版本线的上的第一个版本. * 300位contributors的超过2 ...
- Python数据结构——栈的链表实现
自定义链表实现栈的数据结构,代码如下: class Stack: def __init__(self): self._first = None def push(self,item): self._f ...
- (17)什么是jQuery(jq的流程和基本操作)
jQuery就是对原生js二次封装的工具类(在jq叫构造函数) jQuery就是一堆方法的集合,jq对象就可以直接调用这些方法来完成指定的需求 使用jq的流程: 1.在HTML页面倒入jq.js文件 ...
- 【shell编程】之基础知识了解shell
一.什么是shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了 ...
- Linux配置浮动IP
在高可用集群环境中,一般都需要使用浮动IP来实现web高可用(High Availability). 浮动IP的概念以及为什么需要浮动IP请参考:https://blog.csdn.net/readi ...
- Windows和linux 文件互传
一般我是直接在windows下创建一个共享文件夹,然后在linux挂载,我一直都是这么干的. 直到有一天,我需要往一个公网linux上面传几个文件,可是我的Windows是内网的,所以,这种方法行不通 ...
- fcntl获取和修改文件打开状态标志
[root@bogon code]# cat b.c #include<stdio.h> #include<error.h> #include<unistd.h> ...
- BizDevOps — the true value proposition of workflow engines
转自:https://blog.bernd-ruecker.com/bizdevops-the-true-value-proposition-of-workflow-engines-f342509ba ...
- RESTful Web API 理解
REST 是一种应用架构风格,不是一种标准,是面向资源架构(ROA)风格,与具体技术平台无关,REST架构的应用未必建立在Web之上,与之对应的是传统的Web Service 采用的面向操作的RPC架 ...