PySide - 类变量无法修改

时间:2014-03-19 17:28:48

标签: python qt pyside

我有一个名为Panel的类,它派生自PySide.QtGui.QWidget。我想跟踪我创建的面板数量。为此,我引入了一个名为count的类变量。类定义片段如下:

class Panel(QtGui.QWidget):
    count = 0
    def __init__(self, parent=None):
        super(Panel, self).__init__(parent)
        Panel.count += 1
        print(Panel.count)

但是当我实例化新面板时,只打印一系列零。但我希望看到一个序列1 2 3 ...换句话说,Panel.count += 1似乎被忽略而没有任何警告或错误。

当我对从普通Python的对象而不是QWidget派生的另一个类做同样的事情时,它按照预期的方式工作。

任何想法为什么会这样?

4 个答案:

答案 0 :(得分:1)

如果这不起作用,这将是PySide中的一个错误。

以下是我使用PySide-1.2.1运行代码时得到的结果(稍作修正,因为缺少self参数):

>>> from PySide import QtGui
>>> app = QtGui.QApplication([])
>>> class Panel(QtGui.QWidget):
...     count = 0
...     def __init__(self, parent=None):
...         super(Panel, self).__init__(parent)
...         Panel.count += 1
...         print(Panel.count)
... 
>>> p1 = Panel()
1
>>> p2 = Panel()
2
>>> p3 = Panel()
3
>>> Panel.count
3

答案 1 :(得分:1)

只是一个有根据的猜测:通过重新分配class属性,可能会发生QT垃圾收集器中的一些奇怪行为。您观察到的行为可能与this issue有关。

答案 2 :(得分:0)

很可能这是PySide使用的Shiboken Python C ++绑定生成器的工件。这会将通常的元类type替换为Shiboken.ObjectType(以检查类型使用的元类print(Panel.__class__))。元数据可以在python中彻底改变类的行为,就像在这种情况下一样。

答案 3 :(得分:0)

问题是它有时会起作用,但有时候不行。 为了减轻这个问题,你可以使用全局变量,但这不是一个很好的解决方案。