python - PyQT4 signal.connect 是否使对象保持事件状态?

标签 python garbage-collection pyqt pyqt4 signals-slots

如果我有一个信号并且我向该信号注册了一个对象函数,这是否会使该对象保持事件状态并停止该对象的垃圾收集?

例如

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/

相关文章:

python - 如何从 tensorflow 数据集迭代器返回同一批处理两次?

python - 从序列中减去数据框(或其唯一的列)

javascript - 自定义 JavaScript 垃圾收集器

Java 8 : CMS does not kick on for old generation even though CMSInitiatingOccupancyFraction specified

python - PDF 输出不适用于 Pyqt5 和 Python 3.5

python - PyOpenGL。 x = glGetDoublev(GL_MODELVIEW_MATRIX) 返回内存地址

python - Scrapy 没有抓取所有页面

java - 堆转储中符合 GC 条件的对象?

python - QHBoxLayout 以不同的顺序添加小部件

pyqt - 如何从 valueChanged 信号中找到发射器 Spinbox?