PyQT将λ函数连接到信号
我遇到以下问题。我试图将一个lambda函数连接到一个Signal来最终传递一些额外的数据。PyQT将λ函数连接到信号
def createTimeComboBox(self,slotCopy):
timeComboBox = QComboBox()
#...
cmd = lambda func=self.test:func()
self.connect(timeComboBox, SIGNAL("currentIndexChanged(int)"),cmd)
#...
def test(self, value):
print value
当我运行createTimeComboBox(),
我得到这个错误:
TypeError: 'int' object is not callable
更改
self.connect(timeComboBox, SIGNAL("currentIndexChanged(int)"),cmd)
到
self.connect(timeComboBox, SIGNAL("currentIndexChanged(int)"),self.test)
工作正常,但我希望能够通过slotCopy
也是可变的,所以假设我需要使用lambda
方法。
我以前用QPushButton
的clicked()
信号完成了这个工作,并且工作正常。
def createToDoctorButton(self,extraData):
toDoctorButton = QPushButton()
cmd = lambda func=self.goToDoctor:func(extraData)
self.connect(toDoctorButton, SIGNAL('clicked()'),cmd)
return toDoctorButton
def goToDoctor(self,extraData):
print extraData
我希望这是有道理的 - 有没有人有任何想法?感谢您的任何建议! 干杯 戴夫
你lambda
接受参数(func
):
lambda func=self.test:func()
尽管该参数有一个默认值,但如果传递参数,它将被替换。查看信号currentIndexChanged(int)
,显示信号将传递一个整数参数。 func
将是来自currentIndexChanged
的整数。后来,做func()
将得到有效试图调用一个整数对象,这显然是不合法的(因为错误指示)
你需要在你的lambda
“抓住”传递的参数另一个参数不重写func
参数:
cmd = lambda value, func=self.test: func(value)
顺便说一句,你的test
方法需要一个参数,所以你不能只是做func()
。
您没有clicked()
信号的问题,因为它没有传递参数来替换默认值。
看看这对你的作品:
timeComboBox.currentIndexChanged.connect(self.test)
这里是一个小的工作示例,展示了使用和不使用lambda表达式新型信号/插槽连接:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from PyQt4 import QtCore, QtGui
class myWindow(QtGui.QWidget):
def __init__(self, parent=None):
super(myWindow, self).__init__(parent)
self.comboBox = QtGui.QComboBox(self)
self.comboBox.addItems([str(x) for x in range(3)])
self.comboBox.currentIndexChanged.connect(self.on_comboBox_currentIndexChanged)
slotLambda = lambda: self.on_comboBox_currentIndexChanged_lambda("some_value")
self.comboBox.currentIndexChanged.connect(slotLambda)
@QtCore.pyqtSlot(int)
def on_comboBox_currentIndexChanged(self, value):
print value
@QtCore.pyqtSlot(str)
def on_comboBox_currentIndexChanged_lambda(self, string):
print string
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
app.setApplicationName('myWindow')
main = myWindow()
main.show()
sys.exit(app.exec_())
嘿,谢谢!我还没有设法通过这个,但今天晚些时候会有希望! –
真棒谢谢你,那曾经工作过!谢谢你解释! –
加上我,你怎么知道参数被覆盖? – user1767754
@ user1767754通过信号在Qt中工作。插槽可以具有相同或更少的参数,多余的参数将被忽略。但其余的将会通过。无论你是否有该参数的默认值都没关系。如果一个信号通过一个参数,插槽将会收到它,如果可以的话。 – Avaris