PySide6.QtCore.Property

class Property

详细描述

Property 函数允许您声明既作为 Qt 属性又作为 Python 属性的属性,并且它们的 getter 和 setter 被定义为 Python 函数。

它们等同于Qt Docs中的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

通常只使用typefget``和 ``fset

与Python属性相比的属性

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

注意

Python 属性对象在 QML 中起作用;需要使用 QtCore.Property

在上面的例子中,以下行将是等效的属性:

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)