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

测试对象仍会收到信号吗?

解决方法:

不,这不会,仅使对象保持活动状态还不够.去尝试一下:

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必须确保它保留对函数的引用,并且对象(自身)在lambda的闭包中始终被引用.

上一篇:Reflow、Repaint 性能优化


下一篇:python-模拟pyqt中的鼠标移动