我遇到了以下问题.我正在尝试将lambda函数连接到Signal以最终传递一些额外的数据.
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
Run Code Online (Sandbox Code Playgroud)
当我运行时,createTimeComboBox(),我收到此错误:
TypeError: 'int' object is not callable
Run Code Online (Sandbox Code Playgroud)
更改
self.connect(timeComboBox, SIGNAL("currentIndexChanged(int)"),cmd)
Run Code Online (Sandbox Code Playgroud)
至
self.connect(timeComboBox, SIGNAL("currentIndexChanged(int)"),self.test)
Run Code Online (Sandbox Code Playgroud)
工作正常,但我希望能够传递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
Run Code Online (Sandbox Code Playgroud)
我希望这是有道理的 - 有没有人有任何想法?谢谢你的任何建议!干杯戴夫
你lambda接受一个参数(func):
lambda func=self.test:func()
Run Code Online (Sandbox Code Playgroud)
尽管参数具有默认值,但如果传递参数,则将替换该参数.查看信号,currentIndexChanged(int)表明信号将传递整数参数.func将是来自的整数currentIndexChanged.稍后,做func()有效的尝试调用一个显然不合法的整数对象(如错误所示)
您需要另一个参数lambda来"捕获"传递的参数而不覆盖func参数:
cmd = lambda value, func=self.test: func(value)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你的test方法需要一个参数,所以你不能这样做func().
您没有clicked()信号的问题,因为它没有传递参数来替换默认值.