class 属性#

详细描述#

属性函数允许您声明既作为Qt属性又作为Python属性的行为,并且将其获取器和设置器定义为Python函数。

它们与Qt文档中的Q_PROPERTY宏等价。

以下是一个说明如何使用此函数的示例

 1 from PySide6.QtCore import QObject, Property
 2
 3 class MyObject(QObject):
 4     def __init__(self, startval=42):
 5         QObject.__init__(self)
 6         self.ppval = startval
 7
 8     def readPP(self):
 9         return self.ppval
10
11     def setPP(self, val):
12         self.ppval = val
13
14     pp = Property(int, readPP, setPP)
15
16 obj = MyObject()
17 obj.pp = 47
18 print(obj.pp)

有关QtCore.Property的完整选项,请参阅QtCore.Property.__doc__

Property(self, type: type,
         fget: Optional[Callable] = None,
         fset: Optional[Callable] = None,
         freset: Optional[Callable] = None,
         fdel: Optional[Callable] = None,
         doc: str = '',
         notify: Optional[Callable] = None,
         designable: bool = True,
         scriptable: bool = True,
         stored: bool = True, user: bool = False,
         constant: bool = False,
         final: bool = False) -> PySide6.QtCore.Property

通常,只使用typefgetfset

与Python属性的比较#

Python具有与QtCore.Property非常相似的属性对象。尽管后者有一个额外的freset函数,但属性的用法几乎是相同的。主要区别在于QtCore.Property需要一个type参数。

在上面的示例中,以下行会是等效属性

pp = QtCore.Property(int, readPP, setPP)    # PySide version
pp = property(readPP, setPP)                # Python version

正如您从Python文档中了解的,Python允许使用装饰器语法将属性创建分解成多个步骤。我们也可以在PySide中这样做。

 1 from PySide6.QtCore import QObject, Property
 2
 3 class MyObject(QObject):
 4     def __init__(self, startval=42):
 5         QObject.__init__(self)
 6         self.ppval = startval
 7
 8     @Property(int)
 9     def pp(self):
10         return self.ppval
11
12     @pp.setter
13     def pp(self, val):
14         self.ppval = val
15
16 obj = MyObject()
17 obj.pp = 47
18 print(obj.pp)

请注意此处:这两个 Python 函数具有相同的名称,这是故意的。这是为了让 Python 知道这些函数属于同一属性。

QML表达式中的属性#

如果您在使用QML表达式中的对象属性,QML要求必须通知属性的变化。下面是一个示例说明如何执行此操作

 1 from PySide6.QtCore import QObject, Signal, Property
 2
 3 class Person(QObject):
 4
 5     name_changed = Signal()
 6
 7     def __init__(self, name):
 8         QObject.__init__(self)
 9         self._person_name = name
10
11     def _name(self):
12         return self._person_name
13
14     name = Property(str, _name, notify=name_changed)