¿PyQT4 signal.connect mantiene los objetos en vivo?

Si tengo una señal y registro una función de objetos en la señal, ¿esto mantendrá el objeto vivo y detendrá la recolección de basura de ese objeto?

P.ej

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() 

¿El objeto de prueba seguirá recibiendo la señal?

No, no lo hará, no es suficiente para mantener vivo el objeto. Solo inténtalo:

 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() 

Salida:

 first Done second 

Este comportamiento solo se aplica cuando se conecta una señal a un método enlazado. Como ejemplo, si usas:

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

en su lugar, entonces funcionará. Si la biblioteca no tuviera una referencia sólida aquí, nunca podría conectar una función anónima a una señal. Entonces, en este caso, pyqt debe asegurarse de que mantiene una referencia a la función, y el objeto ( self ) se mantiene como referencia en el cierre de la lambda.