如果我有一个信号并且我向该信号注册了一个对象函数,这是否会使该对象保持事件状态并停止该对象的垃圾收集?
例如
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
此行为仅适用于将信号连接到绑定(bind)方法时。例如,如果您使用:
s.connect(lambda: self.done())
相反,它将起作用。如果库在这里不保留强引用,那么您永远无法将匿名函数连接到信号。所以在这种情况下,pyqt 必须确保它保持对函数的引用,并且对象 (self
) 保持在 lambda 的闭包中被引用。
关于python - PyQT4 signal.connect 是否使对象保持事件状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17211797/