很简单的问题。我在很多地方都提到过,在旧式类上使用属性不应该起作用,但显然 Qt 类(通过 PyQt4)不是新式的,并且在我的代码中,其中一些类有属性。正在使用(据我所知,代码没有显示任何问题)

我确实遇到了 pyqtProperty 函数,但我似乎找不到任何有关它的文档。在这种情况下,这是一个很好的选择吗?

有帮助吗?

解决方案

属性的作品,因为QObject的有元类是照顾他们。一同见证@夸克代码这个小变化...:

from PyQt4.QtCore import QObject

def makec(base):
  class X( base ):
      def __init__(self):
          self.__x = 10
      def get_x(self):
          print 'getting',
          return self.__x
      def set_x(self, x):
          print 'setting', x
          self.__x = x
      x = property(get_x, set_x)

  print 'made class of mcl', type(X), issubclass(type(X), type)
  return X

class old: pass
for base in (QObject, old):
  X = makec(base)
  x = X()
  print x.x # Should be 10
  x.x = 30
  print x.x # Should be 30

运行此发射:

made class of mcl <type 'PyQt4.QtCore.pyqtWrapperType'> True
getting 10
setting 30
getting 30
made class of mcl <type 'classobj'> False
getting 10
30

看到不同?在这真的是一个传统的类(旧型)班,一个做第二次,元类是classobj(这是不是类型的子类)和属性不工作的权利(分配x.x绕过财产,并经过这让x.x没有看到任何财产或者更多)。但是,在第一种情况下,Qt的情况下,有一个不同的元类,它是类的子类(所以它不是真正正确的说法阶级“是不是新风格”!),事情因此也正常工作。

其他提示

根据我的经验,Python 排序的属性在 PyQt4 对象上工作得很好。我不知道 PyQt4 是否明确支持它们,或者是否存在一些隐藏的问题,但我从未见过它们行为不当。这是使用 PyQt 4.4 和 Python 2.5 的示例:

from PyQt4.QtCore import QObject

class X( QObject ):

    def __init__(self):
        self.__x = 10

    def get_x(self):
        return self.__x

    def set_x(self, x):
        self.__x = x

    x = property(get_x, set_x)

x = X()
print x.x # Should be 10
x.x = 30
print x.x # Should be 30

pyqtProperty 是允许使用 Qt的属性系统 这与 Python 的不一样。Qt 属性可以在 Qt 的 C++ 类中内省(原始 Python 属性则不然),并且由 Qt 用于诸如以下之类的事情: Qt设计师 表单编辑器,以及 Qt创建者 IDE。他们允许很多这样的内省 运行 说明你在 Python 中有,但在 C++ 中没有。一般来说,Qt 为 C++ 提供了动态语言的一些功能,这并不是 PyQt 提供不止一种方法来做同样事情的唯一领域(还可以考虑字符串、字典、文件 I/O 等)。对于大多数选择,我的主要建议是选择一侧或另一侧并坚持下去,以避免出现一些令人不快的不兼容的可能性。与 Qt 版本相比,我更喜欢 Python 版本,因为 Python 比 Qt 对我的工作更核心。如果您打算考虑将任何内容从 PyQt 移植回 C++ Qt,那么您可能更喜欢 Qt 版本的功能而不是 Python 版本。

至少在PyQt4.5,Qt类当然是新的风格的对象,如从它们的方法解析顺序看出:

from PyQt4 import QtGui
print QtGui.QWidget.__mro__
(<class 'PyQt4.QtGui.QWidget'>, <class 'PyQt4.QtCore.QObject'>, <type 'sip.wrapper'>, <class 'PyQt4.QtGui.QPaintDevice'>, <type 'sip.simplewrapper'>, <type 'object'>)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top