gpt4 book ai didi

signals - 为什么 PySide 隐式地从 Signals 的类成员创建对象成员?

转载 作者:行者123 更新时间:2023-12-04 11:46:27 29 4
gpt4 key购买 nike

关于 PySide signals and slots page它说:“信号是实例拥有的运行时对象,它们不是类属性”。显然, QObject 构造函数查找 Signals 的类属性并将它们复制到对象实例。我的测试程序证实了这一点。

从 PySide 导入 QtCore

class Klass(QtCore.QObject):
lst = []
sig = QtCore.Signal(str)

def main():
obj1 = Klass()
obj2 = Klass()

print "id: obj1.lst = {}, obj1.sig = {}".format(id(obj1.lst), id(obj1.sig))
print "id: obj2.lst = {}, obj2.sig = {}".format(id(obj2.lst), id(obj2.sig))
print "id: klass.lst = {}, klass.sig = {}".format(id(Klass.lst), id(Klass.sig))

if __name__ == '__main__':
main()

在我的输出中,您可以看到现在有三个信号对象,而 lst-member 的 id 对于对象和类都是相同的。

id: obj1.lst  = 4317739344, obj1.sig  = 4297560376
id: obj2.lst = 4317739344, obj2.sig = 4297560400
id: klass.lst = 4317739344, klass.sig = 4317851072

隐式创建对象属性只是令人困惑,因此风格不佳(恕我直言)。也许他们确实有充分的理由这样做,但我没有看到他们。所以我的问题是:为什么他们选择这个解决方案而不是仅仅在构造函数中将信号创建为常规属性?

最佳答案

它们不是复制品。如果你检查这些类型,你会看到 class 属性是 PySide.QtCore.Signal并且实例属性是 PySide.QtCore.SignalInstance .

print "type(obj1.sig): {}".format(type(obj1.sig))
print "type(obj2.sig): {}".format(type(obj2.sig))
print "type(Klass.sig): {}".format(type(Klass.sig))

# type(obj1.sig): <type 'PySide.QtCore.SignalInstance'>
# type(obj2.sig): <type 'PySide.QtCore.SignalInstance'>
# type(Klass.sig): <type 'PySide.QtCore.Signal'>

这是必要的,因为 Qt 定义信号的方式。 Qt 使用 Meta-Object System注册信号/插槽。为了使这项工作正常进行,PySide 在幕后做了一些“魔法”,将您的自定义类属性信号注册到元对象系统,并返回一个与实例属性同名的可用信号 ( SignalInstance)。

原装 Signal仍然存在,但被实例属性覆盖:

print "obj1.sig -> type: {}, id: {}".format(type(obj1.sig), id(obj1.sig))
print "obj1.__class__.sig -> type: {}, id: {}".format(type(obj1.__class__.sig), id(obj1.__class__.sig))
print "Klass.sig -> type: {}, id: {}".format(type(Klass.sig), id(Klass.sig))

# obj1.sig -> type: <type 'PySide.QtCore.SignalInstance'>, id: 40629904
# obj1.__class__.sig -> type: <type 'PySide.QtCore.Signal'>, id: 41556352
# Klass.sig -> type: <type 'PySide.QtCore.Signal'>, id: 41556352

关于signals - 为什么 PySide 隐式地从 Signals 的类成员创建对象成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52627074/

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