簡體   English   中英

PyQT4 signal.connect是否保持對象生效?

[英]Does PyQT4 signal.connect keep objects live?

如果我有一個信號並且我向信號注冊一個對象函數,這會使對象保持活動並停止該對象的垃圾收集嗎?

例如

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

此行為僅在將信號連接到綁定方法時適用。 例如,如果您使用:

s.connect(lambda: self.done())

相反,它會工作。 如果庫不會在這里保留強引用,那么你永遠不能將匿名函數連接到信號。 所以在這種情況下,pyqt必須確保它保持對函數的引用,並且對象( self )保持在lambda的閉包中被引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM