PyQT4 signal.connect是否保持对象生效?

时间:2013-06-20 10:53:32

标签: python garbage-collection pyqt pyqt4 signals-slots

如果我有信号并且我向信号注册了一个对象函数,这会使对象保持活动并停止该对象的垃圾收集吗?

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

测试目标是否仍会得到信号?

1 个答案:

答案 0 :(得分: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的闭包中被引用。