1

キーが PyQT インターフェイスのすべてのダイヤルの名前である辞書があります。これらのキーに関連付けられた値は、各ダイヤルに関連付けられた特定の数値であり、(どのダイヤルが移動されたかを判断するために) ハンドラー関数に渡す必要があります。また、そのダイヤルの新しい値も一緒に指定します。

functools.partial を使用して、数値ごとにハンドラー関数の異なるインスタンスを作成しましたが、「valueChanged」シグナルは整数を返し、それを部分関数に渡す方法もわかりません。dialChanged 関数が呼び出されないため、次のコードは機能しないようです。

for dial, cc, in dialDict.iteritems():
    getattr(self.ui, dial).setRange(0,127)
    getattr(self.ui, dial).valueChanged.connect(
        lambda value: partial(self.windowHandler.dialChanged, 
                              mainWindowInstance=self, 
                              cc=cc, 
                              value=value))

問題は for ループとスコープ内でのラムダ関数の使用に関係していると思いますが、valueChanged シグナルの戻り値をパーシャルによって作成されたスロットに渡す方法がわかりません。任意の提案をいただければ幸いです。

4

1 に答える 1

2

実際、ここでパーシャルを使用してラムダを捨てるのは理にかなっていると思いますが、dialChangedハンドラーにコールバックに適した署名を持たせるには:

# where ever this is defined
def dialChanged(value, mainWindowInstance=None, cc=None):
    pass

cbk = partial(
    self.windowHandler.dialChanged, 
    mainWindowInstance=self, 
    cc=cc)

.valueChanged.connect(cbk)

スロットは値引数で呼び出されるので、これは私が考える署名と一致するはずです。ラムダは、dialChanged スロット関数を制御できず、呼び出しをラップして署名を完全に再フォーマットする必要がある場合にのみ必要です。

于 2012-04-04T00:56:32.133 に答える