pyqt信号和槽传递额外参数
来源:互联网 发布:遗传算法求解步骤 编辑:程序博客网 时间:2024/05/17 23:37
环境:
python2.7.8
pyqt 4.11.1
使用Pyqt编程过程中,经常会遇到给槽函数传递额外参数的情况。但是信号-槽机制只是指定信号如何连接到槽,信号定义的参数被传递给槽,而额外的参数(用户定义)不能直接传递。
而传递额外参数又是很有用处。你可能使用一个槽处理多个组件的信号,有时要传递额外的信息。
一种方法是使用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 1') 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 partialimport sysclass 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('5') layout.addWidget(but) but.clicked.connect(lambda: self.on_click('5')) #使用个who变量,结果不正常,显示 False is pressed #but.clicked.connect(lambda who="5": self.on_click(who)) #使用封装,partial函数 but = QPushButton('6') layout.addWidget(but) but.clicked.connect(partial(self.on_click, '6')) 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_()
1 1
- pyqt信号和槽传递额外参数
- PyQt 信号和槽传递额外参数
- pyqt信号和槽传递额外参数
- PyQt5学习笔记16----PyQt信号和槽传递额外参数
- pyqt中信号与槽的参数传递。
- 信号和槽-Pyqt
- 信号和槽之间的传递参数
- QT信号和槽参数传递
- Thinkphp5 表单提交额外参数和页面跳转参数传递
- 信号槽如何传递参数
- PyQT之信号槽
- pyqt信号与槽
- QT信号和槽以结构体为参数传递
- PyQt学习笔记-开端篇 信号和槽 signal slot
- PyQt GUI--信号与槽
- pyqt自定义信号与槽
- pyqt4信号与槽之间参数传递
- pyqt4信号与槽之间参数传递
- JAVA中类Cursor的定义
- 利用ENGINE替换OPENSSL中的加解密算法
- SQLSERVER中的 CEILING函数和 FLOOR函数
- Hadoop MapReduce的shuffle过程
- adb shell命令使android设备睡眠或唤醒
- pyqt信号和槽传递额外参数
- eclipse设置编辑框颜色
- C++类型转换 总结
- 关于easyUI在子页面增加显示tabs的一个问题
- android 通过客服端 同步 客户端的touch操作
- UE的注册流程
- MODEL/VIEW (一)
- 对于UITextField无法换行的情况下,采用label+UITextField进行操作
- ubuntu 安装imagemagick()