gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:19:44 25 4
gpt4 key购买 nike

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

例如

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com