假设我有一个对象,并且希望在发出PyQt信号时执行其中的一个方法。并且假设我希望它执行一个不由信号传递的参数。因此,我创建了一个lambda作为信号的槽函数:
通常情况下,使用PyQt的信号和槽时,信号连接不会阻止垃圾回收。当连接的槽对象被垃圾回收时,相应的信号被发射时该槽将不再被调用。
然而,当使用lambda表达式时,它是如何工作的呢?我没有存储lambda表达式的引用,但信号槽连接仍然可以正常工作。因此,lambda表达式没有被垃圾回收。
如果现在将
为什么会发生这种情况呢?
class MyClass(object):
def __init__(self, model):
model.model_changed_signal.connect(lambda: self.set_x(model.x(), silent=True))
通常情况下,使用PyQt的信号和槽时,信号连接不会阻止垃圾回收。当连接的槽对象被垃圾回收时,相应的信号被发射时该槽将不再被调用。
然而,当使用lambda表达式时,它是如何工作的呢?我没有存储lambda表达式的引用,但信号槽连接仍然可以正常工作。因此,lambda表达式没有被垃圾回收。
如果现在将
MyClass
的实例设置为None
,那么该实例也不会被垃圾回收:发射model_changed_signal
仍然会成功执行lambda表达式。因此,MyClass
实例的引用被保留在某个地方(可能是lambda表达式的上下文中?)- 而我并不想要这样。为什么会发生这种情况呢?
model.model_changed_signal.connect(ModelListener().handle_signal)
,那么ModelListener
的实例将被垃圾回收,handle_signal
将永远不会被调用。 - tjalling