Is there a way to create an "actual" Qt property in PyQt?
Ales Erjavec
ales.erjavec324 at gmail.com
Thu Oct 22 22:12:45 BST 2020
> ...
> Note that I don't really care for some further lines in the class
> definition/constructor; what I'd really prefer is to always have a
> consistent way to access properties if they *also are* Qt properties.
A while ago I had a similar thought of subverting the property
descriptor protocol:
class Q_Property(pyqtProperty):
"""
A property descriptor that more closely resembles the
Q_PROPERTY macro.
Encourage a coding style which is consistent with Qt.
Example:
>>> class Foo(QObject):
... _bar = 0
... def bar(self):
... return self._bar
... def setBar(self, bar):
... self._bar = bar
... bar = Q_Property(int, fget=bar, fset=setBar)
>>> obj = Foo()
>>> obj.setBar(2)
>>> obj.bar()
2
>>> obj.setProperty("bar", 42)
True
>>> obj.property("bar")
42
>>> obj.bar()
42
"""
def __get__(self, obj, cls=None):
# Simply return the contained (bound) fget method
return self.fget.__get__(obj, cls)
def __set__(self, obj, value):
raise TypeError
# these do not work
def setter(self, f):
raise RuntimeError
def getter(self, f):
raise RuntimeError
But have not actually used it anywhere. Usually I just
use the convention of adding a underscore suffix to the
property member i.e.
bar_ = pyqtProperty(int, fget=bar, fset=setBar)
More information about the PyQt
mailing list