summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2023-08-18 12:21:27 +0200
committerUlf Hermann <ulf.hermann@qt.io>2023-08-21 14:15:51 +0200
commit9306db6d465a165ebe2edcbe5b0180f04d0c46ee (patch)
tree8df51114d4c98b0ab8213122a4d762d2f17a0d23
parent7c9e61a3fe6da233571f24acf7ec9d9a8fc43210 (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.cpp4
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp10
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 {