2013-06-20 30 views
3

如果我有一個信號,並且我將一個對象函數註冊到信號中,這會使對象保持活動並停止該對象的垃圾回收?PyQT4 signal.connect是否使對象保持活動狀態?

E.g.

class Signals(): 
    signal = Qt.pyqtSignal() 
    def __init__(self): 
     QObject.__init__(self) 

class Test(); 
    def __init__(self, s): 
     s.connect(self.done) 

    def done(self): 
     print("Done") 

s = Signals() 
t = Test(s.signal) 
t = None 
s.signal.emit() 

測試對象仍會得到信號嗎?

回答

4

不,它不會讓物體繼續存活。試試看:

from PyQt4.QtCore import * 

app = QCoreApplication([]) 

class Signals(QObject): 
    signal = pyqtSignal() 
    def __init__(self): 
     QObject.__init__(self) 

class Test(): 
    def __init__(self, s): 
     s.connect(self.done) 

    def done(self): 
     print("Done") 


s = Signals() 
t = Test(s.signal) 
print("first") 
s.signal.emit() 
app.processEvents() 

t = None 
print("second") 
s.signal.emit() 
app.processEvents() 

輸出:

first 
Done 
second 

的信號連接到綁定的方法時,此行爲才適用。作爲一個例子,如果你使用:

s.connect(lambda: self.done()) 

相反,那麼它將工作。如果庫不會在這裏保留一個強有力的參考,那麼你永遠不能將一個匿名函數連接到一個信號。所以在這種情況下,pyqt必須確保它保持對該函數的引用,並且該對象(self)保持在lambda的閉包中被引用。

+0

是的,這在我的測試中似乎也是如此。我遇到的主要問題是處理QNetworkRequest完成信號。由於GC的原因,我必須有一個班級來處理每個請求,但它只會被「打」一段時間 –

相關問題