diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2023-08-25 13:17:16 +0200 |
---|---|---|
committer | Ivan Solovev <ivan.solovev@qt.io> | 2023-09-03 18:20:13 +0200 |
commit | b6b94111c77df60c425617d0d76a6574906294c0 (patch) | |
tree | 0e42cd7d7c4627ccf3072665bfe886e72ec9467f | |
parent | 5cad1d7a042f9d524a5b0f5dadb4643c5537d8ef (diff) |
QPropertyAnimation: fix binding loops
... by using valueBypassingBindings() when accessing the properties
from the setters.
Task-number: QTBUG-116346
Pick-to: 6.6 6.5
Change-Id: I04abc394f4406dc0fa75c55a9093e10c27a20c30
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
-rw-r--r-- | src/corelib/animation/qpropertyanimation.cpp | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/corelib/animation/qpropertyanimation.cpp b/src/corelib/animation/qpropertyanimation.cpp index 985371d30f..3bee809509 100644 --- a/src/corelib/animation/qpropertyanimation.cpp +++ b/src/corelib/animation/qpropertyanimation.cpp @@ -60,7 +60,8 @@ QT_BEGIN_NAMESPACE void QPropertyAnimationPrivate::updateMetaProperty() { - if (!targetObject || propertyName.value().isEmpty()) { + const QObject *target = targetObject.valueBypassingBindings(); + if (!target || propertyName.value().isEmpty()) { propertyType = QMetaType::UnknownType; propertyIndex = -1; return; @@ -68,19 +69,19 @@ void QPropertyAnimationPrivate::updateMetaProperty() //propertyType will be set to a valid type only if there is a Q_PROPERTY //otherwise it will be set to QVariant::Invalid at the end of this function - propertyType = targetObject->property(propertyName.value()).userType(); - propertyIndex = targetObject->metaObject()->indexOfProperty(propertyName.value()); + propertyType = target->property(propertyName.value()).userType(); + propertyIndex = target->metaObject()->indexOfProperty(propertyName.value()); if (propertyType != QMetaType::UnknownType) convertValues(propertyType); if (propertyIndex == -1) { //there is no Q_PROPERTY on the object propertyType = QMetaType::UnknownType; - if (!targetObject->dynamicPropertyNames().contains(propertyName)) + if (!target->dynamicPropertyNames().contains(propertyName)) qWarning("QPropertyAnimation: you're trying to animate a non-existing property %s of " "your QObject", propertyName.value().constData()); - } else if (!targetObject->metaObject()->property(propertyIndex).isWritable()) { + } else if (!target->metaObject()->property(propertyIndex).isWritable()) { qWarning("QPropertyAnimation: you're trying to animate the non-writable property %s of " "your QObject", propertyName.value().constData()); @@ -163,15 +164,16 @@ void QPropertyAnimation::setTargetObject(QObject *target) } d->targetObject.removeBindingUnlessInWrapper(); - if (d->targetObject == target) + const QObject *oldTarget = d->targetObject.valueBypassingBindings(); + if (oldTarget == target) return; - if (d->targetObject != nullptr) - QObject::disconnect(d->targetObject, &QObject::destroyed, this, nullptr); + if (oldTarget != nullptr) + QObject::disconnect(oldTarget, &QObject::destroyed, this, nullptr); d->targetObject.setValueBypassingBindings(target); - if (d->targetObject != nullptr) { - QObject::connect(d->targetObject, &QObject::destroyed, this, + if (target != nullptr) { + QObject::connect(target, &QObject::destroyed, this, [d] { d->targetObjectDestroyed(); }); } d->updateMetaProperty(); @@ -201,7 +203,7 @@ void QPropertyAnimation::setPropertyName(const QByteArray &propertyName) d->propertyName.removeBindingUnlessInWrapper(); - if (d->propertyName == propertyName) + if (d->propertyName.valueBypassingBindings() == propertyName) return; d->propertyName.setValueBypassingBindings(propertyName); |