在PyQt4 中動態連接槽和訊號
在PyQt4 中,以程式設計方式將多個槽連接到訊號在循環內完成時可能會導致意外行為.
問題:
考慮創建一個帶有循環內動態產生的數字按鈕的計算器。如果每個按鈕的'clicked()'訊號連接如下:
def __init__(self): for i in range(0, 10): self._numberButtons += [QPushButton(str(i), self)] self.connect(self._numberButtons[i], SIGNAL('clicked()'), lambda : self._number(i))
問題:
當任何一個按鈕被點擊時,它們都會列印'9 '。這種行為源自於 Python 的作用域和閉包語意。 lambda 表達式引用變數 i,該變數在循環內計算為最終值「9」。
解決方案:
要避免此問題,請傳遞i作為具有預設值的關鍵字參數:
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
或者,使用functools.partial 以獲得更簡潔的方法:
self._numberButtons[i].clicked.connect(partial(self._number, i))
這些解決方案將lambda 表達式中的i 隔離,確保每個單擊按鈕時會觸發其預期操作。
以上是如何在 PyQt4 中動態連線槽和訊號而不會出現意外行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!