diff --git a/src/corelib/kernel/qpointer.h b/src/corelib/kernel/qpointer.h index 3e922897929..80faef29901 100644 --- a/src/corelib/kernel/qpointer.h +++ b/src/corelib/kernel/qpointer.h @@ -83,7 +83,7 @@ public: { wp.assign(static_cast(p)); return *this; } inline T* data() const - { return static_cast(wp.d == nullptr || wp.d->strongref.load() == 0 ? nullptr : wp.value); } + { return static_cast(wp.internalData()); } inline T* operator->() const { return data(); } inline T& operator*() const @@ -143,7 +143,7 @@ template QPointer qPointerFromVariant(const QVariant &variant) { - return QPointer(qobject_cast(QtSharedPointer::weakPointerFromVariant_internal(variant).data())); + return QPointer(qobject_cast(QtSharedPointer::weakPointerFromVariant_internal(variant).internalData())); } template diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index d16a7c6659a..f0aca7c14e9 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -568,7 +568,7 @@ public: #if QT_DEPRECATED_SINCE(5, 14) QT_DEPRECATED_X("Use toStrongRef() instead, and data() on the returned QSharedPointer") - T *data() const noexcept { return d == nullptr || d->strongref.load() == 0 ? nullptr : value; } + T *data() const noexcept { return internalData(); } #endif inline QWeakPointer() noexcept : d(nullptr), value(nullptr) { } @@ -678,6 +678,12 @@ public: #else template friend class QSharedPointer; template friend class QPointer; + template + friend QWeakPointer::Value, X>::type> + qWeakPointerFromVariant(const QVariant &variant); + template + friend QPointer + qPointerFromVariant(const QVariant &variant); #endif template @@ -701,6 +707,13 @@ public: value = actual; } + // ### Qt 6: remove users of this API; no one should ever access + // a weak pointer's data but the weak pointer itself + inline T *internalData() const noexcept + { + return d == nullptr || d->strongref.load() == 0 ? nullptr : value; + } + Data *d; T *value; }; @@ -974,11 +987,13 @@ qobject_cast(const QWeakPointer &src) return qSharedPointerObjectCast::Type, T>(src); } +/// ### Qt 6: make this use toStrongRef() (once support for storing +/// non-managed QObjects in QWeakPointer is removed) template QWeakPointer::Value, T>::type> qWeakPointerFromVariant(const QVariant &variant) { - return QWeakPointer(qobject_cast(QtSharedPointer::weakPointerFromVariant_internal(variant).data())); + return QWeakPointer(qobject_cast(QtSharedPointer::weakPointerFromVariant_internal(variant).internalData())); } template QSharedPointer::Value, T>::type>