PyQT将lambda函数连接到Signal

Dav*_*lla 5 python pyqt

我遇到了以下问题.我正在尝试将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方法.

我曾与一个以前做过QPushButtonclicked()信号,并能正常工作.

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)

我希望这是有道理的 - 有没有人有任何想法?谢谢你的任何建议!干杯戴夫

Ava*_*ris 5

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()信号的问题,因为它没有传递参数来替换默认值.