pyqt信号和槽传递额外参数

环境:

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 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('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_()
时间: 2024-08-07 00:28:52

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

pyqt信号和槽应用举例

第一篇手写随笔. 项目的部分代码: 在子线程中改变主窗体的标签. class MyForm(QDialog): def __init__(self, parent=None): self.configBox = MyConfigForm() #configBox为另一个类的实例,连接另一个类,singnal()自己理解为给信号定义一个名称.self.set_begin_with是一个方法在这个方法中修改标签. self.connect(self.configBox, SIGNAL("set_be

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

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

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

最近由于项目的需求,一直在研究Qt.信号与槽机制是Qt的一大特色,该机制允许两者间传递参数,依次来实现对象间的通信.这个参数会分别存在于信号的参数列表和槽函数的参数列表中.需要注意的是,若将槽函数绑定至信号,槽函数的参数列表元素数目只能少于等于信号的参数列表元素数目.而且顺序和类型不能改变.至于缺少的参数应从信号参数尾部开始缺少. 突然今天想起来一个问题,如果一个对象发出信号,将内部的一个成员变量(非简单类型)作为参数向外发送,槽函数就可以接收到这个对象,那么槽函数是否可以完全操作这个对象呢?如

【Qt】2.2 继续了解信号和槽

槽和普通成员函数一样,可以是虚函数.被重载,可以是公有.私有.保护的.它可以被其它C++成员函数调用. 槽连接了信号,当发射这个信号时,槽会被自动调用. 连接函数: bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection ) sende

QT学习之信号和槽

摘要:在QT中,我们可以使用系统提供的函数实现信号和槽的链接,但是在QT中不仅仅如此,还可以让用户自己定义信号和槽函数.在本文中,我将在自己定义的teacher类下定义信号函数hungry,然后在自己定义的student类下定义槽函数treat,最后在wedget类下将两个函数进行链接.触发.显示. 1.teacher类 有信号函数,本例中就是hungry,有参数和没有参数的,其中有参数的函数中的参数代表要传递的内容 头文件: 1 #ifndef TEACHER_H 2 #define TEAC

QT学习小结之信号与槽

信号与槽函数是我们学习QT必备的基础知识,今天跟大家分享我学习QT的一些总结吧. 信号槽机制是Qt编程的基础.通过信号槽,能够使Qt各组件在不知道对方的情形下能够相互通讯. 槽函数和普通的C++成员函数没有很大的区别.它们也可以使virtual的:可以被重写:可以使public.protected或者private的:可以由其它的C++函数调用:参数可以是任何类型的.如果要说区别,那就是,槽函数可以和一个信号相连接,当这个信号发生时,它可以被自动调用. 信号与槽函数的连接我们可以用connect

信号和槽

1) 信号的定义必须在signals:保留字下,并且不需要实现 2)槽的定义必须在slots:保留字下,需要实现 3)信号和槽通过QObject::connect函数连接 4)当信号被触发时,槽函数被调用 需要注意的是: 1)信号和槽,是QT的拓展,所以实现信号和槽的类,必须是QObject的子类 2)实现信号和槽的类,必须以宏Q_OBJECT开始 3)连接信号和槽,要用到SIGNAL和SLOT宏,转换函数为字符串 4)一个信号可以和多个槽连接,槽函数调用的顺序是不确定的 5)多个信号可以同时连

Qt之信号与槽

有关这个概念网上有太多太多的资料了,这些资料也非常健全,比如下面这些文章,后两篇比较高端,现在还没完全整明白,感谢tingsking18大神 http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/ http://blog.csdn.net/tingsking18/article/details/4800828 http://blog.csdn.net/tingsking18/article/details/499

4自定义信号和槽函数

自定义信号和槽 信号和槽的本质都是函数. 区别: 信号必须由signal关键字来声明 信号可以重载 信号没有返回值,但可以有参数.由于信号都是没有返回值,所以,槽函数一定没有返回值 信号就是函数的声明,只需声明,无需定义.槽既要函数声明也要完成定义. 使用方式:emit MySignal(); 例子说明:本例创建两个独立的窗口,分别在窗口中放置一个按钮,由此来进行两个窗口的切换.如:"切换到子窗口",即子窗口显示,主窗口隐藏.反之亦然. 按照之前的方式创建程序,另外在项目中"