Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.
Qt for Python UsingQtProperties: Difference between revisions
m (CristianMaureiraFredes moved page Using Qt Properties in PySide to Qt for Python UsingQtProperties) |
(Introduced possibility of constant properties) |
||
(2 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
[[Category: | [[Category:Qt for Python]] | ||
PySide2 provides a ''Property'' function which allows for declaring properties that simultaneously behave both as Qt and Python properties, and have their setters and getters defined as Python functions. | PySide2 provides a ''Property'' function which allows for declaring properties that simultaneously behave both as Qt and Python properties, and have their setters and getters defined as Python functions. | ||
Line 13: | Line 13: | ||
self.ppval = startval | self.ppval = startval | ||
def readPP(self): | def readPP(self): | ||
return self.ppval | |||
def setPP(self,val): | def setPP(self,val): | ||
self.ppval = val | |||
pp = Property(int, readPP, setPP) | pp = Property(int, readPP, setPP) | ||
obj = MyObject() | obj = MyObject() | ||
obj.pp = 47 | obj.pp = 47 | ||
Line 27: | Line 28: | ||
== Properties in QML expressions == | == Properties in QML expressions == | ||
If you are using properties of your objects in QML expressions, QML requires the property to be NOTIFYable. | If you are using properties of your objects in QML expressions, QML requires the property to be NOTIFYable or constant. If the value of the property changes over time, you should apply NOTIFYable using a simple signal: | ||
<syntaxhighlight lang="python" line='line'> | <syntaxhighlight lang="python" line='line'> | ||
Line 37: | Line 38: | ||
self._person_name = name | self._person_name = name | ||
def _name(self): | def _name(self): | ||
return self._person_name | |||
@Signal | @Signal | ||
def name_changed(self): | def name_changed(self): | ||
pass | |||
name = Property(str, _name, notify=name_changed) | name = Property(str, _name, notify=name_changed) | ||
</syntaxhighlight> | |||
You can use constant if your value is immutable. Use it as follows: | |||
<syntaxhighlight lang="python" line='line'> | |||
from PySide2.QtCore import QObject, Signal, Property | |||
class Person(QObject): | |||
def __init__(self, name): | |||
QObject.__init__(self) | |||
self._person_name = name | |||
def _name(self): | |||
return self._person_name | |||
name = Property(str, _name, constant=True) | |||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 16:48, 17 March 2020
PySide2 provides a Property function which allows for declaring properties that simultaneously behave both as Qt and Python properties, and have their setters and getters defined as Python functions.
A short example illustrating defining and accessing a Qt property from Python is given below:
from PySide2.QtCore import QObject, Property
class MyObject(QObject):
def __init__(self,startval=42):
QObject.__init__(self)
self.ppval = startval
def readPP(self):
return self.ppval
def setPP(self,val):
self.ppval = val
pp = Property(int, readPP, setPP)
obj = MyObject()
obj.pp = 47
print(obj.pp)
Properties in QML expressions
If you are using properties of your objects in QML expressions, QML requires the property to be NOTIFYable or constant. If the value of the property changes over time, you should apply NOTIFYable using a simple signal:
from PySide2.QtCore import QObject, Signal, Property
class Person(QObject):
def __init__(self, name):
QObject.__init__(self)
self._person_name = name
def _name(self):
return self._person_name
@Signal
def name_changed(self):
pass
name = Property(str, _name, notify=name_changed)
You can use constant if your value is immutable. Use it as follows:
from PySide2.QtCore import QObject, Signal, Property
class Person(QObject):
def __init__(self, name):
QObject.__init__(self)
self._person_name = name
def _name(self):
return self._person_name
name = Property(str, _name, constant=True)