2012-06-22 27 views
0

這是我的問題。我想創建n的數量QLineEdit小部件(n可以是任何數字,取決於輸入值)。我可以創建這些小工具,給它們提供對象名稱和文本,但是我不能在它們上面定義信號(我希望每個小工具在與它進行交互時都會發出信號)。這裏是OD代碼的例子:PyQt - 定義循環中多個對象的信號

self.fieldList = {} 

for (i, value) in attrMap.iteritems(): 
    self.fieldList["valueField" + str(i)] = QtGui.QLineEdit() 
    self.fieldList["valueField" + str(i)].setObjectName(_fromUtf8("attributeValueField_{0}".format(i))) 
    self.fieldList["valueField" + str(i)].setText(_fromUtf8("{0}".format(value.toString()))) 
    self.fieldList["valueField" + str(i)].cursorPositionChanged.connect(lambda: (self.checkState(self.fieldList["valueField" + str(i)]))) 

的問題仍然存在在最後一行:

self.fieldList["valueField" + str(i)].cursorPositionChanged.connect(lambda: (self.checkState(self.fieldList["valueField" + str(i)]))) 

我認爲信號會堅持每一個部件,但由於循環,信號「跳躍」從小部件到小部件,直到它到達最後一個小部件,只有最後一個小部件才能發出信號。那麼我該如何安排每個部件在更改時發出信號?

回答

2

說明這裏常見的解決方案(還有更多的,只是搜索如「巨蟒拉姆達循環參數」:https://stackoverflow.com/a/938493

另一種常見的解決方案是使用部分功能:

import functools 
slot = functools.partial(self.checkState, self.fieldList["valueField" + str(i)]) 
self.fieldList["valueField" + str(i)].cursorPositionChanged.connect(slot) 
+0

我做functools,但我得到了同樣的邏輯錯誤。 – PersianGulf

0

問題這裏是關閉,你的lambda中的i指的是值爲i的lambda函數被調用時,而不是當它被定義時,所以在循環結束後,所有的is將會看到相同的值

爲了解決這個問題:

self.fieldList = {} 

for (i, value) in attrMap.iteritems(): 
    self.fieldList["valueField" + str(i)] = QtGui.QLineEdit() 
    self.fieldList["valueField" + str(i)].setObjectName(_fromUtf8("attributeValueField_{0}".format(i))) 
    self.fieldList["valueField" + str(i)].setText(_fromUtf8("{0}".format(value.toString()))) 
    self.fieldList["valueField" + str(i)].cursorPositionChanged.connect(lambda old, new, i=i: (self.checkState(self.fieldList["valueField" + str(i)]))) 

你可以找到更多關於這個問題here

+0

這就是它!非常感謝。我一直在努力解決這個問題!再次感謝! – kyuss