diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 1d039b6f18a..30f31f54f60 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -1209,14 +1209,15 @@ int qRegisterNormalizedMetaType(const QT_PREPEND_NAMESPACE(QByteArray) &normaliz const QMetaType metaType = QMetaType::fromType(); const int id = metaType.id(); - if (id > 0) { + QtPrivate::SequentialContainerTransformationHelper::registerConverter(); + QtPrivate::SequentialContainerTransformationHelper::registerMutableView(); + QtPrivate::AssociativeContainerTransformationHelper::registerConverter(); + QtPrivate::AssociativeContainerTransformationHelper::registerMutableView(); + QtPrivate::MetaTypePairHelper::registerConverter(); + QtPrivate::MetaTypeSmartPointerHelper::registerConverter(); + + if (normalizedTypeName != metaType.name()) { QMetaType::registerNormalizedTypedef(normalizedTypeName, metaType); - QtPrivate::SequentialContainerTransformationHelper::registerConverter(); - QtPrivate::SequentialContainerTransformationHelper::registerMutableView(); - QtPrivate::AssociativeContainerTransformationHelper::registerConverter(); - QtPrivate::AssociativeContainerTransformationHelper::registerMutableView(); - QtPrivate::MetaTypePairHelper::registerConverter(); - QtPrivate::MetaTypeSmartPointerHelper::registerConverter(); } return id; @@ -1348,6 +1349,12 @@ struct QMetaTypeIdQObject } QT_END_NAMESPACE \ /**/ +template +int qRegisterMetatypeIndirection() +{ + return qRegisterNormalizedMetaType(QMetaType::fromType().name()); +} + #ifndef Q_MOC_RUN #define Q_DECLARE_METATYPE(TYPE) Q_DECLARE_METATYPE_IMPL(TYPE) #define Q_DECLARE_METATYPE_IMPL(TYPE) \ @@ -1361,6 +1368,12 @@ struct QMetaTypeIdQObject static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); \ if (const int id = metatype_id.loadAcquire()) \ return id; \ + const auto mt = QMetaType::fromType(); \ + if (QByteArrayView(mt.name()) == (#TYPE)) { \ + qRegisterMetatypeIndirection(); \ + metatype_id.storeRelease(mt.id()); \ + return mt.id(); \ + } \ const int newId = qRegisterMetaType< TYPE >(#TYPE); \ metatype_id.storeRelease(newId); \ return newId; \