【问题标题】:Does PyQT4 signal.connect keep objects live?PyQT4 signal.connect 是否使对象保持活动状态?
【发布时间】:2013-06-17 04:49:33
【问题描述】:

如果我有一个信号并且我向该信号注册了一个对象函数,这将使对象保持活动状态并停止该对象的垃圾收集吗?

例如

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

Test 对象还会收到信号吗?

【问题讨论】:

    标签: python garbage-collection pyqt pyqt4 signals-slots


    【解决方案1】:

    不,它不会,这不足以让对象保持活力。试试看:

    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 必须确保它保持对函数的引用,并且对象 (self) 在 lambda 的闭包中保持被引用。

    【讨论】:

    • 是的,在我的测试中似乎也是如此。我遇到的主要问题是处理 QNetworkRequest 完成信号。我必须有一个类来处理每个请求,但由于 GC
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多