在 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中文網其他相關文章!