首頁 >後端開發 >Python教學 >為什麼將 Lambda 表達式與 PyQt 槽一起使用會導致意外行為?

為什麼將 Lambda 表達式與 PyQt 槽一起使用會導致意外行為?

Patricia Arquette
Patricia Arquette原創
2024-11-19 20:43:02919瀏覽

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

在 PyQt 中使用 Lambda 表達式連接槽

在 PyQt 中,lambda 表達式可用於將訊號連接到槽。但是,在某些場景中使用 lambda 表達式可能會導致意外行為。

請考慮以下程式碼:

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 ,button_pushed 方法接收 False。

此行為的原因是 QPushButton 的點擊訊號發出參數,該參數指示按鈕的狀態。在槽中使用 lambda 表達式時,指派的值(例如本例中的 x=idx)會被發出的參數覆寫。

要解決此問題,lambda 表達式應忽略按鈕狀態並使用一個附加的命名參數:

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

此修改可確保將正確的值傳遞給button_pushed 方法,無論按鈕的狀態如何state.

理解lambda 表達式的機制也至關重要。在槽連接的上下文中,當訊號觸發時,不會評估 lambda 函數。相反,指向函數的指標(帶有替換的參數)連接到訊號。當訊號發出時,將使用訊號傳遞的參數來呼叫連接的函數。

以上是為什麼將 Lambda 表達式與 PyQt 槽一起使用會導致意外行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn