Pyqt/Qt信号与槽的理解(四)

使用自定义参数

在PyQt编程过程中,经常会遇到给槽函数传递自定义参数的情况,比如有一个信号与槽函数的连接是

button1.clicked.connect(show_page)

我们知道对于clicked信号来说,它是没有参数的;对于show_page函数来说,希望它可以接收参数。希望show_page函数像如下这样:

def show_page(self, name):
print(name,"  点击啦")

于是就产生一个问题——信号发出的参数个数为0,槽函数接收的参数个数为1,由于0<1,这样运行起来一定会报错(原因是信号发出的参数个数一定要大于槽函数接收的参数个数)。解决这个问题就是本节的重点:自定义参数的传递

from PyQt5.QtWidgets import QMainWindow, QPushButton , QWidget , QMessageBox, QApplication, QHBoxLayout
import sys 

class WinForm(QMainWindow):  
    def __init__(self, parent=None):  
        super(WinForm, self).__init__(parent)  
        self.setWindowTitle("信号和槽传递额外参数例子")
        button1 = QPushButton('Button 1')  
        button2 = QPushButton('Button 2')  

        button1.clicked.connect(lambda: self.onButtonClick(1)) 
        button2.clicked.connect(lambda: self.onButtonClick(2))      

        layout = QHBoxLayout()  
        layout.addWidget(button1)  
        layout.addWidget(button2)  

        main_frame = QWidget()  
        main_frame.setLayout(layout)       
        self.setCentralWidget(main_frame)  

    def onButtonClick(self, n):  
        print('Button {0} 被按下了'.format(n))  
        QMessageBox.information(self, "信息提示框", 'Button {0} clicked'.format(n))            

if __name__ == "__main__":  
    app = QApplication(sys.argv)  
    form = WinForm()  
    form.show()  
    sys.exit(app.exec_())

演示效果:

这里写图片描述
这里写图片描述qt

代码分析:

单击“Button 1”按钮,将弹出一个信息提示框,提示信息为“Button 1 clicked”。Python控制台的输出信息为:

Button 1 被按下了

这里重点解释onButtonClick()函数是怎样处理从两个按钮传来的信号的。使用lambda表达式传递按钮数字给槽函数,当然也可以传递其他任何东西,甚至是按钮控件本身(假设槽函数打算把传递信号的按钮修改为不可用的话)。

另一种解决方法是使用functools中的partial函数:

button1.clicked.connect(partial(self.onButtonClick, 1))           
button2.clicked.connect(partial(self.onButtonClick, 2))

猜你喜欢

转载自blog.csdn.net/zhangziju/article/details/80256063