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方法。

我以前用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 

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

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

+0

真棒谢谢你,那曾经工作过!谢谢你解释! –

+0

加上我,你怎么知道参数被覆盖? – user1767754

+0

@ user1767754通过信号在Qt中工作。插槽可以具有相同或更少的参数,多余的参数将被忽略。但其余的将会通过。无论你是否有该参数的默认值都没关系。如果一个信号通过一个参数,插槽将会收到它,如果可以的话。 – Avaris

看看这对你的作品:

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_()) 
+0

嘿,谢谢!我还没有设法通过这个,但今天晚些时候会有希望! –