diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 025fbb6372..b743e78890 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -1545,7 +1545,10 @@ namespace QtPrivate Q_CORE_EXPORT bool isBuiltinType(const QByteArray &type); } // namespace QtPrivate -template ::Value> +template ::Value ? QMetaType::PointerToQObject : + QtPrivate::IsGadgetHelper::Value ? QMetaType::IsGadget : + QtPrivate::IsQEnumHelper::Value ? QMetaType::IsEnumeration : 0> struct QMetaTypeIdQObject { enum { @@ -1725,8 +1728,9 @@ QT_DEPRECATED inline Q_DECL_CONSTEXPR int qRegisterMetaType(T *) #endif #endif +#ifndef QT_NO_QOBJECT template -struct QMetaTypeIdQObject +struct QMetaTypeIdQObject { enum { Defined = 1 @@ -1749,6 +1753,53 @@ struct QMetaTypeIdQObject } }; +template +struct QMetaTypeIdQObject +{ + enum { + Defined = 1 + }; + + static int qt_metatype_id() + { + static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); + if (const int id = metatype_id.loadAcquire()) + return id; + const char * const cName = T::staticMetaObject.className(); + const int newId = qRegisterNormalizedMetaType( + cName, + reinterpret_cast(quintptr(-1))); + metatype_id.storeRelease(newId); + return newId; + } +}; + +template +struct QMetaTypeIdQObject +{ + enum { + Defined = 1 + }; + + static int qt_metatype_id() + { + static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); + if (const int id = metatype_id.loadAcquire()) + return id; + const char *eName = qt_getEnumName(T()); + const char *cName = qt_getEnumMetaObject(T())->className(); + QByteArray typeName; + typeName.reserve(int(strlen(cName) + 2 + strlen(eName))); + typeName.append(cName).append("::").append(eName); + const int newId = qRegisterNormalizedMetaType( + typeName, + reinterpret_cast(quintptr(-1))); + metatype_id.storeRelease(newId); + return newId; + } +}; +#endif + #ifndef QT_NO_DATASTREAM template inline int qRegisterMetaTypeStreamOperators() diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index 8da96c0977..717a7633f5 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -136,6 +136,11 @@ public: : QObject(parent) { } + enum CustomQEnum { Val1, Val2 }; + Q_ENUM(CustomQEnum) +}; +class CustomGadget { + Q_GADGET }; class CustomNonQObject {}; @@ -146,10 +151,13 @@ void tst_QMetaType::defined() QCOMPARE(int(QMetaTypeId2::Defined), 0); QCOMPARE(int(QMetaTypeId2::Defined), 1); QCOMPARE(int(QMetaTypeId2::Defined), 0); - QVERIFY(QMetaTypeId2::Defined); + QCOMPARE(int(QMetaTypeId2::Defined), 1); + QCOMPARE(int(QMetaTypeId2::Defined), 1); + QVERIFY(int(QMetaTypeId2::Defined)); QVERIFY(!QMetaTypeId2::Defined); QVERIFY(!QMetaTypeId2::Defined); QVERIFY(!QMetaTypeId2::Defined); + QVERIFY(!QMetaTypeId2::Defined); } struct Bar @@ -378,6 +386,11 @@ void tst_QMetaType::typeName_data() QTest::newRow("QMap") << static_cast(::qMetaTypeId >()) << QString::fromLatin1("QMap"); QTest::newRow("QVector>") << static_cast(::qMetaTypeId > >()) << QString::fromLatin1("QVector >"); QTest::newRow("QVector>") << static_cast(::qMetaTypeId > >()) << QString::fromLatin1("QVector >"); + + QTest::newRow("CustomQObject*") << static_cast(::qMetaTypeId()) << QString::fromLatin1("CustomQObject*"); + QTest::newRow("CustomGadget") << static_cast(::qMetaTypeId()) << QString::fromLatin1("CustomGadget"); + QTest::newRow("CustomQObject::CustomQEnum") << static_cast(::qMetaTypeId()) << QString::fromLatin1("CustomQObject::CustomQEnum"); + QTest::newRow("Qt::ArrowType") << static_cast(::qMetaTypeId()) << QString::fromLatin1("Qt::ArrowType"); } void tst_QMetaType::typeName()