summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qpropertybinding.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/kernel/qpropertybinding.cpp')
-rw-r--r--src/corelib/kernel/qpropertybinding.cpp32
1 files changed, 21 insertions, 11 deletions
diff --git a/src/corelib/kernel/qpropertybinding.cpp b/src/corelib/kernel/qpropertybinding.cpp
index 358977e63e..29b1a4a69a 100644
--- a/src/corelib/kernel/qpropertybinding.cpp
+++ b/src/corelib/kernel/qpropertybinding.cpp
@@ -41,6 +41,7 @@
#include "qproperty_p.h"
#include <QScopedValueRollback>
+#include <QVariant>
QT_BEGIN_NAMESPACE
@@ -80,25 +81,34 @@ bool QPropertyBindingPrivate::evaluateIfDirtyAndReturnTrueIfValueChanged()
BindingEvaluationState evaluationFrame(this);
+ QPropertyBindingError evalError;
QUntypedPropertyBinding::BindingEvaluationResult result;
bool changed = false;
if (metaType.id() == QMetaType::Bool) {
auto propertyPtr = reinterpret_cast<QPropertyBase *>(propertyDataPtr);
- bool temp = propertyPtr->extraBit();
- result = evaluationFunction(metaType, &temp);
- if (auto changedPtr = std::get_if<bool>(&result)) {
- changed = *changedPtr;
- if (changed)
- propertyPtr->setExtraBit(temp);
+ bool newValue = false;
+ evalError = evaluationFunction(metaType, &newValue);
+ if (evalError.type() == QPropertyBindingError::NoError) {
+ if (propertyPtr->extraBit() != newValue) {
+ propertyPtr->setExtraBit(newValue);
+ changed = true;
+ }
}
} else {
- result = evaluationFunction(metaType, propertyDataPtr);
- if (auto changedPtr = std::get_if<bool>(&result))
- changed = *changedPtr;
+ QVariant resultVariant(metaType.id(), nullptr);
+ evalError = evaluationFunction(metaType, resultVariant.data());
+ if (evalError.type() == QPropertyBindingError::NoError) {
+ int compareResult = 0;
+ if (!QMetaType::compare(propertyDataPtr, resultVariant.constData(), metaType.id(), &compareResult) || compareResult != 0) {
+ changed = true;
+ metaType.destruct(propertyDataPtr);
+ metaType.construct(propertyDataPtr, resultVariant.constData());
+ }
+ }
}
- if (auto errorPtr = std::get_if<QPropertyBindingError>(&result))
- error = std::move(*errorPtr);
+ if (evalError.type() != QPropertyBindingError::NoError)
+ error = evalError;
dirty = false;
return changed;