2012-02-24 31 views
1

我想在對象列表中執行一個函數,並存儲結果。 我在下面的代碼中存在的問題是,儘管我嘗試斷開所有信號,但functionC始終以某種方式持續觸發。 (斷開連接輸出False)使用PyQt4,雖然我斷開一個插槽,但它一直觸發

class object(...): 
    def init(self): 
    ... 
    self.emit(SIGNAL('result(bool)', result) 
    ... 

class classA(...): 
    def functionA(self): 
    self.results=[] 
    self.i=0 
    self.object[...]=... # len(self.object)=n 
    self.functionB() 

    def functionB(self): 
    self.connect(self.object[self.i], SIGNAL('result(bool)'), lambda bool: self.functionC(bool)) 
    self.object[self.i].init() 

    def functionC(self, result): 
    print self.disconnect(self.object[self.i], SIGNAL('result(bool)', lambda bool: self.functionC(bool)) # outputs False (why cannot I disconnect it?) 
    self.i+=1 
    self.results.append(result) 
    if self.i==len(self.object): 
     print "finish" 
     self.i=0 
     return 
    self.functionB() 

任何人都可以想象這個問題?謝謝

回答

3

我不確定你的代碼只是一個例子,或者如果你真的在爲你的插槽使用lambda函數。如果你確實使用Lambda,其原因很可能是因爲lambda函數是你的連接和斷開之間是完全不同的對象:

>>> fn1 = lambda bool: self.functionC(bool) 
>>> fn2 = lambda bool: self.functionC(bool) 
>>> print fn1, fn2 
<function <lambda> at 0x1004a9320> <function <lambda> at 0x1004a9398> 
>>> fn1 == fn2 
False 
>>> fn1 is fn2 
False 

如果PyQt的是存儲功能的引用,尋找你指定斷開一個,它會報告它沒有連接。你想要做的是實際上引用一個持久的回調。將lambda存儲爲成員屬性,並將兩次引用同一個屬性,或將其定義爲標準方法或函數。

相關問題