diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2021-06-04 17:11:14 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2021-06-04 20:04:43 +0200 |
commit | d7f7d84365dcec364e0248c51f557dd9c59f5f47 (patch) | |
tree | cc15695bc55fe031d63d19a8ddf2238df44d9726 /src/corelib | |
parent | 0078a782548dd25c9bc5f9f30d1719b1e9b039ed (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.cpp | 21 |
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 |