如果我有一个信号并且向该信号注册了一个对象函数,这会使该对象保持活动状态并停止该对象的垃圾收集吗?
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()
测试对象还会收到信号吗?
不,不会,这不足以让对象保持活力。去尝试一下:
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()
Output:
first
Done
second
此行为仅在将信号连接到绑定方法时适用。例如,如果您使用:
s.connect(lambda: self.done())
相反,那么它就会起作用。如果库不会在这里保留强引用,那么您永远无法将匿名函数连接到信号。所以在这种情况下 pyqt 必须确保它保留对函数和对象的引用(self
) 在 lambda 闭包中继续引用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)