- 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
通常,只使用type
、fget
和fset
。
与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)