ホームページ >バックエンド開発 >Python チュートリアル >PyQt スロットでラムダ式を使用すると予期しない動作が発生するのはなぜですか?

PyQt スロットでラムダ式を使用すると予期しない動作が発生するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-19 20:43:02919ブラウズ

Why Does Using Lambda Expressions With PyQt Slots Lead to Unexpected Behavior?

ラムダ式を使用して PyQt でスロットを接続する

PyQt では、ラムダ式を使用して信号をスロットに接続できます。ただし、特定のシナリオでラムダ式を使用すると、予期しない動作が発生する可能性があります。

次のコードを考えてみましょう:

class MainWindow(QtGui.QWidget):
    def __init__(self):
        ...
        self.buttons = []
        for idx in [3, 4]:
            button = QtGui.QPushButton('Button {} auto'.format(idx), self)
            button.clicked.connect(lambda x=idx: self.button_pushed(x))
            self.buttons.append(button)
            main_layout.addWidget(button)

ボタンがクリックされたとき、期待値 3 と 4 を受け取る代わりに

この動作の理由は、QPushButton のクリックされた信号がボタンの状態を示す引数。スロットでラムダ式を使用すると、割り当てられた値 (この場合は x=idx など) が発行された引数によって上書きされます。

この問題を解決するには、ラムダ式でボタンの状態を無視し、次を使用する必要があります。追加の名前付きパラメータ:

button.clicked.connect(lambda state, x=idx: self.button_pushed(x))

この変更により、ボタンの種類に関係なく、正しい値が button_pushed メソッドに渡されるようになります。 state.

ラムダ式のメカニズムを理解することも重要です。スロット接続のコンテキストでは、シグナルの起動時にラムダ関数は評価されません。代わりに、関数へのポインター (置換パラメーターを含む) が信号に接続されます。シグナルが発行されると、シグナルが渡す引数を使用して接続された関数が呼び出されます。

以上がPyQt スロットでラムダ式を使用すると予期しない動作が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。