2013-01-05 12 views
5

次の問題があります。私は最後にいくつかの余分なデータを渡すために信号にラムダ関数を接続しようとしています。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(),を実行すると、私はこのエラーを取得:

self.connect(timeComboBox, SIGNAL("currentIndexChanged(int)"),self.test) 

self.connect(timeComboBox, SIGNAL("currentIndexChanged(int)"),cmd) 

を変更

TypeError: 'int' object is not callable 

が正常に動作しますが、私のことができるようにしたいと思いますを渡す私は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 

誰もが考えていると思いますか?何か提案ありがとう!これはあなたのために働く場合 乾杯 デイブ

答えて

5

あなたlambdaパラメータ(func)を受け取ります。

lambda func=self.test:func() 

パラメータにはデフォルト値がありますが、パラメータが渡された場合は置き換えられます。信号を見ると、currentIndexChanged(int)は、信号が整数パラメータを渡すことを示しています。 funcは、currentIndexChangedからの整数になります。その後、func()を行うと、(エラーが示すように)funcパラメータを上書きすることなく、あなたのlambdaに「キャッチ」渡されたパラメータに別のパラメータを必要とする

を明らかに法的ではない整数オブジェクトを呼び出そうと効果的になります。

cmd = lambda value, func=self.test: func(value) 

ところで、testメソッドではパラメータが必要なので、func()とするだけではなりません。

clicked()信号でこの問題が発生していないのは、デフォルト値を置き換えるパラメータが渡されないためです。

+0

おかげさまでありがとうございました。それを説明してくれてありがとう! –

+0

私から、あなたはどのようにパラメータが上書きされたのを知ったのですか?シグナルはQtで動作します。 – user1767754

+0

@ user1767754スロットは同じまたはより少ない引数を持つことができ、余分なものは無視されます。しかし残りのものは渡されます。あなたがその引数のデフォルトを持っているかどうかは関係ありません。シグナルが引数を渡すと、スロットはできるだけそれを受け取ります。 – Avaris

3

参照:

timeComboBox.currentIndexChanged.connect(self.test) 

ここでラムダとない新しいスタイルのシグナル/スロット接続を実証し、小さな作業例です:

#!/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

ねえ、これはありがとう!私はまだこれを通過することはできませんでしたが、今日は後でうまくいきます! –

関連する問題