【问题标题】:PySide Signal "duplicating" behaviorPySide 信号“复制”行为
【发布时间】:2012-11-30 06:15:51
【问题描述】:
from PySide.QtCore import *

class Eggs(QObject):
    evt_spam = Signal()
    print "Loaded"

a = Eggs()
b = Eggs()
print a.evt_spam
print b.evt_spam
print a.evt_spam is b.evt_spam

输出:

Loaded
<PySide.QtCore.Signal object at 0xa2ff1a0>
<PySide.QtCore.Signal object at 0xa2ff1b0>
False

“加载”只打印一次(如预期的那样;它是一个类变量),但为什么要创建信号的 2 个实例(如果它也是一个类变量)?

【问题讨论】:

  • 这个问题不是学术性的吗?唯一重要的是它的工作原理:所有实例都可以发出信号,所有订阅者(所有连接到信号的实例)都获得信号。我同意这很有趣。但这不是缺陷,也不是对大多数程序的限制。

标签: python qt pyqt pyside qt-signals


【解决方案1】:

它不是在创建类实例时打印,而是在执行类作用域时打印。即使我从未创建过“Test”实例,此代码也会打印“Loaded”。

class Test:
    print "Loaded"

如果您想在类初始化时运行代码,请查看__init__()。此代码将在创建实例时打印“Loaded”,而不是在定义类本身时。

class Test:
    def __init__(self):
        print "Loaded"

当您初始化该类的新实例时,QT 的 QObject 元类似乎正在重写类属性以防止重复信号。也许您可以像这样分配属性:

class Test(QObject):
    def __init__(self, signal):
        self.evt_spam = signal

sig = Signal()
a = Test(sig)
b = Test(sig)

或者这个:

class Test(QObject):
    def signal(self, signal):
        self.evt_spam = evt_spam
        return self

evt_spam = Signal()
a = Test().signal(evt_spam)
b = Test().signal(evt_spam)

【讨论】:

  • 是的,我明白这一点,但为什么要创建 2 个信号实例?我将编辑我的问题以使其更清楚。
  • QObject 是一个元类。我最好的猜测是它正在破坏类属性。如果不继承QObject,结果会有所不同,对吗?
  • 如果我将QObject 更改为object,信号将不起作用,但变量指向相同的内存位置。所以这可能是对的。您认为这种变化的可能性有多大(在 Qt 的未来版本中)?
  • 您需要与 QT 开发人员交谈,但他们这样做可能是有原因的。这是一个告诉你修复你的代码而不是调整所有已经存在的项目的问题——第一个对 PyQT 开发人员来说更方便。当你初始化类时,元类可能正在发挥它的魔力,所以也许你可以在事后重新分配来自外部类范围的信号或使用全局?
猜你喜欢
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多