5

私は次の問題で立ち往生しています。最終的に追加のデータを渡すために、ラムダ関数をシグナルに接続しようとしています。

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'sclicked()シグナルでこれを行ったことがあり、それはうまくいきました。

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

これが理にかなっていることを願っています-誰かアイデアはありますか? ご提案ありがとうございます。乾杯デイブ

4

2 に答える 2

7

パラメータ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()デフォルト値を置き換えるパラメーターを渡さないため、シグナルにその問題はありませんでした。

于 2013-01-05T21:27:41.247 に答える
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_())
于 2013-01-05T18:05:58.710 に答える