Add documentation how to formulate a property binding

To correctly formulate a property binding, some rules must be
followed. So far, these rules are not documented. This patch
adds such documentation.

Task-number: QTBUG-90511
Change-Id: Ibb509ea9098212c95f03433feb1f1aac751c4b2e
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Paul Wicking <paul.wicking@qt.io>
This commit is contained in:
Andreas Buhr 2021-01-26 12:12:16 +01:00
parent 59b0212215
commit 30016562c2
2 changed files with 44 additions and 0 deletions

View File

@ -169,6 +169,44 @@
Here, code triggered in change handlers might use the circle, while it has
the new radius, but still the old area.
\section1 Formulating a Property Binding
Any C++ expression evaluating to the correct type can be used as a binding
expression and be given to the setBinding() method. However, to formulate
a correct binding, some rules must be followed.
Dependency tracking only works on bindable properties. It's the developer's
responsibility to ensure that all properties used in the binding expression
are bindable properties. When non-bindable properties are used in a binding
expression, changes to those properties do not trigger updates to the bound
property. No warning or error is generated either at compile-time or at run-time.
The bound property will be updated only when bindable properties used in the
binding expression are changed.
Non-bindable properties might be used in a binding if it's possible
to ensure that markDirty is called on the property being bound on each
change of the non-bindable dependency.
The bound property might evaluate its binding several times during its lifetime.
The developer must make sure that all objects used in the binding expression
live longer than the binding.
The bindable property system is not thread-safe. Properties used in the binding
expression on one thread must not be read or modified by any other thread.
An object of a QObject-derived class which has a property with a binding must
not be moved to a different thread.
Also, an object of a QObject-derived class which has a property which is used
in a binding must not be moved to a different thread. In this context, it's
irrelevant whether it's used in a binding of a property in the same object
or in a binding of a property in another object.
The binding expression should not read from the property it's a binding for. Otherwise,
an evaluation loop exists.
The binding expression must not write to the property it's a binding for.
Functions used as bindings as well as all code which is called inside a binding
must not co_await. Doing so can confuse the property system's tracking of dependencies.
\section1 Tracking Bindable Properties
Sometimes the relationships between properties cannot be expressed using

View File

@ -1042,6 +1042,8 @@ QString QPropertyBindingError::description() const
is read, the binding is evaluated by invoking the call operator () of \a f.
Whenever a dependency of the binding changes, the binding will be re-evaluated
the next time the value of this property is read.
\sa {Formulating a Property Binding}
*/
/*!
@ -1441,6 +1443,8 @@ QString QPropertyBindingError::description() const
Whenever a dependency of the binding changes, the binding will be re-evaluated
the next time the value of this property is read. When the property value
changes, the owner is notified via the Callback function.
\sa {Formulating a Property Binding}
*/
/*!
@ -1667,6 +1671,8 @@ QString QPropertyBindingError::description() const
Returns any previous binding associated with the property, or a
default-constructed QPropertyBinding<T>.
\sa {Formulating a Property Binding}
*/
/*!