summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2021-06-04 17:11:14 +0200
committerUlf Hermann <ulf.hermann@qt.io>2021-06-04 20:04:43 +0200
commitd7f7d84365dcec364e0248c51f557dd9c59f5f47 (patch)
treecc15695bc55fe031d63d19a8ddf2238df44d9726 /src/corelib
parent0078a782548dd25c9bc5f9f30d1719b1e9b039ed (diff)
QProperty: Refresh the observers after evaluating bindings
Evaluating bindings may actually break bindings, and remove observers. Therefore, we need to re-fetch for notifying afterwards. Fixes: QTBUG-94220 Change-Id: I96a78a825f983f58f1a574bf886e643f54453fdc Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/kernel/qproperty.cpp21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/corelib/kernel/qproperty.cpp b/src/corelib/kernel/qproperty.cpp
index 22e9e2d6e0..32c73278ec 100644
--- a/src/corelib/kernel/qproperty.cpp
+++ b/src/corelib/kernel/qproperty.cpp
@@ -546,16 +546,21 @@ void QPropertyBindingData::notifyObservers(QUntypedPropertyData *propertyDataPtr
if (isNotificationDelayed())
return;
QPropertyBindingDataPointer d{this};
- QPropertyObserverPointer observer = d.firstObserver();
- if (!observer)
- return;
- auto *delay = groupUpdateData;
- if (delay) {
- delay->addProperty(this, propertyDataPtr);
+
+ if (QPropertyObserverPointer observer = d.firstObserver()) {
+ auto *delay = groupUpdateData;
+ if (delay) {
+ delay->addProperty(this, propertyDataPtr);
+ return;
+ }
+ observer.evaluateBindings();
+ } else {
return;
}
- observer.evaluateBindings();
- observer.notify(propertyDataPtr);
+
+ // evaluateBindings() can trash the observers. We need to re-fetch here.
+ if (QPropertyObserverPointer observer = d.firstObserver())
+ observer.notify(propertyDataPtr);
}
int QPropertyBindingDataPointer::observerCount() const