「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Lambda式とPyqtスロット関数を使用すると、なぜ予期しない動作を引き起こすのですか?

Lambda式とPyqtスロット関数を使用すると、なぜ予期しない動作を引き起こすのですか?

2025-04-16に投稿されました
ブラウズ:109

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

lambda式を使用してpyqt

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

次のコードを検討してください。 def __init __(self): ... self.buttons = [] [3、4]のIDXの場合: button = qtgui.qpushbutton( 'button {} auto'.format(idx)、self) button.clicked.connect(lambda x = idx:self.button_pushed(x)) self.buttons.append(ボタン) main_layout.addwidget(button)

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)

この変更により、ボタンの状態に関係なく、正しい値がbutton_pushedメソッドに渡されることが保証されます。スロット接続のコンテキストでは、信号が発火したときにラムダ関数は評価されません。代わりに、関数へのポインター(置換パラメーターを使用)が信号に接続されます。信号が放出されると、接続された関数は、信号が通過する引数と呼ばれます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3