From 43a27888b47e1199c9f12a1c2ce7ab9b073e8a46 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 12 Nov 2024 09:15:26 -0800 Subject: [PATCH] QAdoptedThread: bypass signal notification on an un-observable QObject We've just created the object (we're still inside the constructor). No one can have connected to the signals yet. Change-Id: I1f499b3fc6d2089665bdfffda709e1efaa2c4865 Reviewed-by: Ivan Solovev --- src/corelib/kernel/qobject.cpp | 11 +++++++++++ src/corelib/kernel/qobject_p.h | 1 + src/corelib/thread/qthread.cpp | 4 +++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 36505fae62f..42d2abbb982 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -1288,6 +1288,17 @@ QString QObject::objectName() const return d->extraData ? d->extraData->objectName : QString(); } +/*! + \internal + Only use if you know nothing can be bound yet. Usually used for + internal objects that do get names. +*/ +void QObjectPrivate::setObjectNameWithoutBindings(const QString &name) +{ + ensureExtraData(); + extraData->objectName.setValueBypassingBindings(name); +} + /*! \fn void QObject::setObjectName(const QString &name) Sets the object's name to \a name. diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 0ab9bf02edf..0a729acb82b 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -104,6 +104,7 @@ public: if (!extraData) extraData = new ExtraData(this); } + void setObjectNameWithoutBindings(const QString &name); typedef void (*StaticMetaCallFunction)(QObject *, QMetaObject::Call, int, void **); struct Connection; diff --git a/src/corelib/thread/qthread.cpp b/src/corelib/thread/qthread.cpp index ae280e3671b..723bd4b0da4 100644 --- a/src/corelib/thread/qthread.cpp +++ b/src/corelib/thread/qthread.cpp @@ -126,7 +126,9 @@ QAdoptedThread::QAdoptedThread(QThreadData *data) // we are the main thread QCoreApplicationPrivate::theMainThread.storeRelease(this); QCoreApplicationPrivate::theMainThreadId.storeRelaxed(id); - setObjectName(u"Qt mainThread"_s); + + // bypass the bindings because nothing can be listening yet + d_func()->setObjectNameWithoutBindings(u"Qt mainThread"_s); } // thread should be running and not finished for the lifetime