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
通常只使用
type
、fget``和 ``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)