diff options
Diffstat (limited to 'src/corelib/kernel')
-rw-r--r-- | src/corelib/kernel/qmetatype.cpp | 16 | ||||
-rw-r--r-- | src/corelib/kernel/qmetatype.h | 45 |
2 files changed, 61 insertions, 0 deletions
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index 2ab6681bb9..70c2e236dd 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -175,6 +175,22 @@ struct DefinedTypesFilter { */ /*! + \macro Q_DECLARE_SMART_POINTER_METATYPE(SmartPointer) + \relates QMetaType + + This macro makes the smart pointer \a SmartPointer known to QMetaType as a + smart pointer. This makes it possible to put an instance of SmartPointer<T> into + a QVariant, if T is a type which inherits QObject. + + Note that the QWeakPointer, QSharedPointer and QPointer already have built-in + support, and it is not necessary to use this macro with them. + + This example shows a typical use of Q_DECLARE_SMART_POINTER_METATYPE(): + + \snippet code/src_corelib_kernel_qmetatype.cpp 13 +*/ + +/*! \enum QMetaType::Type These are the built-in types supported by QMetaType: diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index bd4963e4f1..2d9133dbae 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -373,6 +373,8 @@ struct ConverterFunctor : public AbstractConverterFunction struct AssociativeValueTypeIsMetaType; template<typename T, bool> struct IsMetaTypePair; + template<typename, typename> + struct MetaTypeSmartPointerHelper; } class Q_CORE_EXPORT QMetaType { @@ -656,6 +658,7 @@ private: friend bool qRegisterAssociativeConverter(); template<typename, bool> friend struct QtPrivate::AssociativeValueTypeIsMetaType; template<typename, bool> friend struct QtPrivate::IsMetaTypePair; + template<typename, typename> friend struct QtPrivate::MetaTypeSmartPointerHelper; #endif #else public: @@ -1463,6 +1466,12 @@ namespace QtPrivate template<typename T> struct MetaTypePairHelper : IsPair<T> {}; + template<typename T, typename = void> + struct MetaTypeSmartPointerHelper + { + static bool registerConverter(int) { return false; } + }; + Q_CORE_EXPORT bool isBuiltinType(const QByteArray &type); } // namespace QtPrivate @@ -1530,6 +1539,24 @@ namespace QtPrivate { { enum DefinedType { Defined = defined }; }; + + template<typename SmartPointer> + struct QSmartPointerConvertFunctor + { + QObject* operator()(const SmartPointer &p) const + { + return p.operator->(); + } + }; + + template<typename T> + struct QSmartPointerConvertFunctor<QWeakPointer<T> > + { + QObject* operator()(const QWeakPointer<T> &p) const + { + return p.data(); + } + }; } template <typename T> @@ -1565,6 +1592,7 @@ int qRegisterNormalizedMetaType(const QT_PREPEND_NAMESPACE(QByteArray) &normaliz QtPrivate::SequentialContainerConverterHelper<T>::registerConverter(id); QtPrivate::AssociativeContainerConverterHelper<T>::registerConverter(id); QtPrivate::MetaTypePairHelper<T>::registerConverter(id); + QtPrivate::MetaTypeSmartPointerHelper<T>::registerConverter(id); } return id; @@ -1828,6 +1856,23 @@ struct SharedPointerMetaTypeIdHelper<SMART_POINTER<T>, true> \ return newId; \ } \ }; \ +template<typename T> \ +struct MetaTypeSmartPointerHelper<SMART_POINTER<T> , \ + typename QEnableIf<IsPointerToTypeDerivedFromQObject<T*>::Value >::Type> \ +{ \ + static bool registerConverter(int id) \ + { \ + const int toId = QMetaType::QObjectStar; \ + if (!QMetaType::hasRegisteredConverterFunction(id, toId)) { \ + QtPrivate::QSmartPointerConvertFunctor<SMART_POINTER<T> > o; \ + static const QtPrivate::ConverterFunctor<SMART_POINTER<T>, \ + QObject*, \ + QSmartPointerConvertFunctor<SMART_POINTER<T> > > f(o); \ + return QMetaType::registerConverterFunction(&f, id, toId); \ + } \ + return true; \ + } \ +}; \ } \ template <typename T> \ struct QMetaTypeId< SMART_POINTER<T> > \ |