2013-06-20 4 views
3

신호가 있고 개체 기능을 신호에 등록하면 개체가 계속 라이브 상태로 유지되고 해당 개체의 가비지 수집이 중지됩니까?PyQT4 signal.connect는 객체를 계속 유지합니까?

예.

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)는 람다 닫힘에서 계속 참조됩니다.

+0

예, 내 테스트에서도 그렇습니다. 내가 가진 주요 문제는 QNetworkRequest 완료 신호를 처리하는 것이 었습니다. 각 요청을 처리 할 클래스가 있어야했지만 GC로 인해 '일부'시간에만 충돌했습니다. –

관련 문제