diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2020-12-14 12:27:53 +0100 |
---|---|---|
committer | Ivan Solovev <ivan.solovev@qt.io> | 2021-04-21 15:34:28 +0200 |
commit | 1a65a4faf52f83ba3fbbba88cea1c4bb800e8de7 (patch) | |
tree | 3873a758298aba37faade1b1cd60c755815eae1c /src/corelib/kernel/qobject_p.h | |
parent | 696f5ffc64ac90e92520fd8cf9e8313fe80e3b76 (diff) |
QObject: port to new property system
Extended QObjectPrivate::ExtraData to store a pointer
to its parent, and reimplemented qGetBindingStorage()
function for QObjectPrivate::ExtraData.
This allows to use Q_OBJECT_COMPAT_PROPERTY macro
for a property, stored in QObjectPrivate::ExtraData
and solves all the problems with calling a custom
setter.
Task-number: QTBUG-85520
Change-Id: I40e01c29430846359ef9160fa1ae97c702be9a18
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Diffstat (limited to 'src/corelib/kernel/qobject_p.h')
-rw-r--r-- | src/corelib/kernel/qobject_p.h | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 019473018f..673c75fff1 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -61,6 +61,7 @@ #include "QtCore/qsharedpointer.h" #include "QtCore/qvariant.h" #include "QtCore/qproperty.h" +#include "QtCore/private/qproperty_p.h" QT_BEGIN_NAMESPACE @@ -102,12 +103,26 @@ class Q_CORE_EXPORT QObjectPrivate : public QObjectData public: struct ExtraData { - ExtraData() {} + ExtraData(QObjectPrivate *ptr) : parent(ptr) { } + + inline void setObjectNameForwarder(const QString &name) + { + parent->q_func()->setObjectName(name); + } + + inline void nameChangedForwarder(const QString &name) + { + emit parent->q_func()->objectNameChanged(name, QObject::QPrivateSignal()); + } + QList<QByteArray> propertyNames; QList<QVariant> propertyValues; QList<int> runningTimers; QList<QPointer<QObject>> eventFilters; - QString objectName; + Q_OBJECT_COMPAT_PROPERTY(QObjectPrivate::ExtraData, QString, objectName, + &QObjectPrivate::ExtraData::setObjectNameForwarder, + &QObjectPrivate::ExtraData::nameChangedForwarder) + QObjectPrivate *parent; }; typedef void (*StaticMetaCallFunction)(QObject *, QMetaObject::Call, int, void **); @@ -369,8 +384,9 @@ public: cd->ref.ref(); connections.storeRelaxed(cd); } + public: - ExtraData *extraData; // extra data set by the user + mutable ExtraData *extraData; // extra data set by the user // This atomic requires acquire/release semantics in a few places, // e.g. QObject::moveToThread must synchronize with QCoreApplication::postEvent, // because postEvent is thread-safe. @@ -619,7 +635,14 @@ inline QBindingStorage *qGetBindingStorage(QObjectPrivate *o) { return &o->bindingStorage; } - +inline const QBindingStorage *qGetBindingStorage(const QObjectPrivate::ExtraData *ed) +{ + return &ed->parent->bindingStorage; +} +inline QBindingStorage *qGetBindingStorage(QObjectPrivate::ExtraData *ed) +{ + return &ed->parent->bindingStorage; +} QT_END_NAMESPACE |