转载:fengyu09

环境:python2.7.8 —— pyqt 4.11.1

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

第1个方法是使用lambda表达式

  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 2')
  9. button1.clicked.connect(lambda: self.on_button(1))
  10. button2.clicked.connect(lambda: self.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函数。

  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例子。

  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('')
  23. layout.addWidget(but)
  24. but.clicked.connect(lambda: self.on_click(''))
  25. # 使用个who变量,结果不正常,显示 False is pressed
  26. # but.clicked.connect(lambda who="5": self.on_click(who))
  27.  
  28. # 使用封装,partial函数
  29. but = QPushButton('')
  30. layout.addWidget(but)
  31. but.clicked.connect(partial(self.on_click, ''))
  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.  
  45. def on_click(self, n):
  46. self.lbl.setText('%s is pressed' % n)
  47.  
  48. if __name__ == '__main__':
  49. app = QApplication(sys.argv)
  50. bu = Bu1()
  51. bu.show()
  52. app.exec_()

pyqt信号和槽传递额外参数的更多相关文章

  1. Django 传递额外参数及 URL别名

    传递额外参数到视图函数中 在 urls.py 文件中添加下面内容 from django.conf.urls import url urlpatterns = [ url(r'index', view ...

  2. Qt信号与槽传递自定义数据类型——两种解决方法

    信号与槽作为qt中的核心机制,在qt应用开发中经常会用的,但是原生的信号与槽连接传参,只支持基本的数据类型,比如char,int, float,double. 如果想要在信号与槽之间传递自定义参数,比 ...

  3. pyqt信号和槽应用举例

    第一篇手写随笔. 项目的部分代码: 在子线程中改变主窗体的标签. class MyForm(QDialog): def __init__(self, parent=None): self.config ...

  4. MVC 使用 Webuploader 插件 传递额外参数 备忘笔记

    // 实例化 uploader = WebUploader.create({ pick: { id: '#filePicker-2', label: '点击选择图片' }, formData: { k ...

  5. <笔记>TP5的分页传递额外参数

    默认生成的分页只有page一个参数,若需要提供额外的参数才能访问分页(例如查询结果的分页,需要传入查询关键字的参数才能显示结果),则需要设置额外参数query

  6. 关于Qt信号与槽机制的传递方向性研究(结论其实是错误的,但是可以看看分析过程)

    最近由于项目的需求,一直在研究Qt.信号与槽机制是Qt的一大特色,该机制允许两者间传递参数,依次来实现对象间的通信.这个参数会分别存在于信号的参数列表和槽函数的参数列表中.需要注意的是,若将槽函数绑定 ...

  7. Qt带参数的信号和槽

    在Qt的开发过程中,信号带参数是很常见的,在使用带参数的信号槽时,有以下几点需要注意. 当信号和槽函数的参数数量相同时,它们的参数类型要完全一致. 信号和槽函数的声明: signals: void i ...

  8. Django---路由系统,URLconf的配置,正则表达式的说明(位置参数),分组命名(捕获关键字参数),传递额外的参数给视图,命名url和url的反向解析,url名称空间

    Django---路由系统,URLconf的配置,正则表达式的说明(位置参数),分组命名(捕获关键字参数),传递额外的参数给视图,命名url和url的反向解析,url名称空间 一丶URLconf配置 ...

  9. QT从入门到入土(三)——信号和槽机制

    摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...

随机推荐

  1. 51Nod 1459:迷宫游戏(最短路)

    1459 迷宫游戏  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...

  2. Spark各个版本新特性

    后续会添加spark生态系统中各个组件的兼容支持情况... Spark2.0.0 * 2016-07-27正式发布 * 它是2.x版本线的上的第一个版本. * 300位contributors的超过2 ...

  3. Python数据结构——栈的链表实现

    自定义链表实现栈的数据结构,代码如下: class Stack: def __init__(self): self._first = None def push(self,item): self._f ...

  4. (17)什么是jQuery(jq的流程和基本操作)

    jQuery就是对原生js二次封装的工具类(在jq叫构造函数) jQuery就是一堆方法的集合,jq对象就可以直接调用这些方法来完成指定的需求 使用jq的流程: 1.在HTML页面倒入jq.js文件 ...

  5. 【shell编程】之基础知识了解shell

    一.什么是shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了 ...

  6. Linux配置浮动IP

    在高可用集群环境中,一般都需要使用浮动IP来实现web高可用(High Availability). 浮动IP的概念以及为什么需要浮动IP请参考:https://blog.csdn.net/readi ...

  7. Windows和linux 文件互传

    一般我是直接在windows下创建一个共享文件夹,然后在linux挂载,我一直都是这么干的. 直到有一天,我需要往一个公网linux上面传几个文件,可是我的Windows是内网的,所以,这种方法行不通 ...

  8. fcntl获取和修改文件打开状态标志

    [root@bogon code]# cat b.c #include<stdio.h> #include<error.h> #include<unistd.h> ...

  9. BizDevOps — the true value proposition of workflow engines

    转自:https://blog.bernd-ruecker.com/bizdevops-the-true-value-proposition-of-workflow-engines-f342509ba ...

  10. RESTful Web API 理解

    REST 是一种应用架构风格,不是一种标准,是面向资源架构(ROA)风格,与具体技术平台无关,REST架构的应用未必建立在Web之上,与之对应的是传统的Web Service 采用的面向操作的RPC架 ...