PySide6.QtCore.Property¶
- class Property¶
Detailed Description¶
The Property function lets you declare properties that behave both as Qt and Python properties, and have their getters and setters defined as Python functions.
They are equivalent to the
Q_PROPERTYmacro in the Qt Docs.Here is an example that illustrates how to use this function:
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)
The full options for
QtCore.Propertycan be found withQtCore.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[PySide6.QtCore.Signal] = None, designable: bool = True, scriptable: bool = True, stored: bool = True, user: bool = False, constant: bool = False, final: bool = False) -> PySide6.QtCore.Property
Normally, only
type,fget``and ``fsetare used.Properties compared with Python properties¶
Pythonhas property objects very similar toQtCore.Property. Despite the fact that the latter has an extrafresetfunction, the usage of properties is almost the same. The main difference is thatQtCore.Propertyrequires atypeparameter.Note
Pythonproperty objects do not work in QML;QtCore.Propertyneeds to be used.In the above example, the following lines would be equivalent properties:
pp = QtCore.Property(int, readPP, setPP) # PySide version pp = property(readPP, setPP) # Python version
As you know from the Python Docs,
Pythonallows to break the property creation into multiple steps, using the decorator syntax. We can do this inPySideas well: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)
Please be careful here: The two
Pythonfunctions have the same name, intentionally. This is needed to letPythonknow that these functions belong to the same property.Properties in QML expressions¶
If you are using properties of your objects in QML expressions, QML requires that the property changes are notified. Here is an example illustrating how to do this:
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)