diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-08-18 12:21:27 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-08-21 14:15:51 +0200 |
commit | 9306db6d465a165ebe2edcbe5b0180f04d0c46ee (patch) | |
tree | 8df51114d4c98b0ab8213122a4d762d2f17a0d23 | |
parent | 7c9e61a3fe6da233571f24acf7ec9d9a8fc43210 (diff) |
QObject: Do not register an observer when writing objectName property
Observers should only be registered when _reading_ the property.
Otherwise we get binding loops.
Pick-to: 6.6 6.5
Change-Id: I974f6ea444fa7a5d333ed79eea6f34e3d757d169
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
-rw-r--r-- | src/corelib/kernel/qobject.cpp | 4 | ||||
-rw-r--r-- | tests/auto/corelib/kernel/qobject/tst_qobject.cpp | 10 |
2 files changed, 12 insertions, 2 deletions
diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 002b9bcab1..90d1f6745c 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -1321,7 +1321,7 @@ void QObject::doSetObjectName(const QString &name) d->extraData->objectName.removeBindingUnlessInWrapper(); - if (d->extraData->objectName != name) { + if (d->extraData->objectName.valueBypassingBindings() != name) { d->extraData->objectName.setValueBypassingBindings(name); d->extraData->objectName.notify(); // also emits a signal } @@ -1339,7 +1339,7 @@ void QObject::setObjectName(QAnyStringView name) d->extraData->objectName.removeBindingUnlessInWrapper(); - if (d->extraData->objectName != name) { + if (d->extraData->objectName.valueBypassingBindings() != name) { d->extraData->objectName.setValueBypassingBindings(name.toString()); d->extraData->objectName.notify(); // also emits a signal } diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index 31345cc333..a4f761d6b9 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -8197,6 +8197,16 @@ void tst_QObject::objectNameBinding() QObject obj; QTestPrivate::testReadWritePropertyBasics<QObject, QString>(obj, "test1", "test2", "objectName"); + + const QPropertyBinding<QString> binding([]() { + QObject obj2; + obj2.setObjectName(QLatin1String("no loop")); + return obj2.objectName(); + }, {}); + obj.bindableObjectName().setBinding(binding); + + QCOMPARE(obj.objectName(), QLatin1String("no loop")); + QVERIFY2(!binding.error().hasError(), qPrintable(binding.error().description())); } namespace EmitToDestroyedClass { |