使用 lambda 将参数传递给槽函数


#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore
class Example(QtGui.QMainWindow):
    def __init__(self):
        super(Example, self).__init__();
        self.initUI()

    def initUI(self):
        self.button = QtGui.QPushButton("print clicked",self)
        self.clicked='not_clicked'
        self.button.clicked.connect(lambda opt='clicked': self.option(opt)) 
    def option(self,opt):
        self.clicked=opt
        print opt

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())
if __name__=='__main__':
    main()

请考虑此代码。现在,当我单击"打印单击"按钮时。"假"被打印(在选项函数中)。为什么会这样?

QPushButton 继承了 QAbstractButton 的信号clicked
Qt文档指出:

void QAbstractButton::clicked ( bool check = false ) [信号]

当按钮被激活(即在鼠标光标在按钮内时按下然后释放)、键入快捷键或调用 click() 或 animateClick() 时,会发出此信号。值得注意的是,如果您调用 setDown()、setChecked() 或 toggle(),则不会发出此信号。

如果按钮可检查,则选中按钮时为 true;如果未选中按钮,则为 false。

插槽收到的参数指示是否选中按钮。由于默认情况下QPushButton不可检查。参数总是False.这就是打印"假"的原因。

如果您希望打印结果不同,打印"真"或"假",您可以将按钮设置为checkable或将其更改为QCheckBox
例如,initUI应该是

def initUI(self):
    self.button = QtGui.QCheckBox("print clicked",self)
    self.button.setCheckable(True)
    self.clicked='not_clicked'
    self.button.clicked.connect(lambda opt='clicked': self.option(opt)) 

def initUI(self):
    #self.button = QtGui.QPushButton("print clicked",self)
    self.button = QtGui.QCheckBox("print clicked",self)
    self.clicked='not_clicked'
    self.button.clicked.connect(lambda opt='clicked': self.option(opt)) 

最新更新