Bindable property docs: mention virtual setters and getters

Update the bindable property docs to explain how to deal with virtual
getters and setters.

Task-number: QTBUG-92994
Pick-to: 6.2
Change-Id: I6c29011817e83623414b39afee0f39ad4cc5c1c9
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This commit is contained in:
Ivan Solovev 2021-04-21 12:52:49 +02:00
parent 320e9c7623
commit c0716994f3
2 changed files with 58 additions and 0 deletions

View File

@ -167,6 +167,39 @@
Here, code triggered in change handlers might use the circle, while it has
the new radius, but still the old area.
\section1 Bindable Properties with Virtual Setters and Getters
Property setters and getters should normally be minimal and do nothing but
setting the property; hence it is not normally appropriate for such setters
and getters to be virtual. There is nothing it makes sense for the derived
class to do.
However some Qt classes can have properties with virtual setters. When
subclassing such a Qt class, overriding such setters requires special care.
In any case the base implementation \e must be called for the binding to
work correctly.
The following illustrates this approach.
\badcode
void DerivedClass::setValue(int val)
{
// do something
BaseClass::setValue(val);
// probably do something else
}
\endcode
All the common rules and recomendations regarding writing to bindable
properties also apply here. As soon as the base class implementation is
called, all the observers are notified about the change to the property.
This means that class invariants must be met before calling the base
implementation.
In the rare case where such virtual getters or setters are necessary, the
base class should document the requirements it imposes on overrides.
\section1 Formulating a Property Binding
Any C++ expression evaluating to the correct type can be used as a binding

View File

@ -1425,6 +1425,31 @@ QString QPropertyBindingError::description() const
be analyzed carefully to comply with the rules given in
\l {Writing to a Bindable Property}.
\section2 Properties with Virtual Setters
Some of the pre-existing Qt classes (for example, \l QAbstractProxyModel)
have properties with virtual setters. Special care must be taken when
making such properties bindable.
For the binding to work properly, the property must be correctly handled in
all reimplemented methods of each derived class.
Unless the derived class has access to the underlying property object, the
base implementation \e must be called for the binding to work correctly.
If the derived class can directly access the property instance, there is no
need to explicitly call the base implementation, but the property's value
\e must be correctly updated.
Refer to \l {Bindable Properties with Virtual Setters and Getters} for more
details.
In both cases the expected behavior \e must be documented in the property's
documentation, so that users can correctly override the setter.
Properties for which these conditions cannot be met should not be made
bindable.
\sa Q_OBJECT_COMPAT_PROPERTY, QObjectBindableProperty, {Qt's Property System}, {Qt Bindable
Properties}
*/