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

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

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


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

[python]  view plain copy
  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
  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
  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_()  

你可能感兴趣的:(python,PyQt5)