From 1e62e3c638d14809de9a439e497bb389dd761685 Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Sat, 21 Nov 2020 11:10:50 +0100 Subject: QMetaType: Track whether type is QML list type This information is required in the QML engine to handle list properties (instances of QQmlListproperty and list types from QML). Change-Id: I1e30572f1c91f58b290cb9b4b07433af99a1db6f Reviewed-by: Ulf Hermann (cherry picked from commit 5806ecf5cb24cf39ea2608d42246eafbaa817582) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/kernel/qmetatype.cpp | 1 + src/corelib/kernel/qmetatype.h | 5 +++ .../corelib/kernel/qmetatype/tst_qmetatype.cpp | 42 ++++++++++++---------- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index d4ab51d323..ab3e47d4b1 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -420,6 +420,7 @@ Q_GLOBAL_STATIC(QMetaTypeCustomRegistry, customTypeRegistry) \omitvalue TrackingPointerToQObject \omitvalue IsGadget \omit This type is a Q_GADGET and it's corresponding QMetaObject can be accessed with QMetaType::metaObject Since 5.5. \endomit \omitvalue PointerToGadget + \omitvalue IsQmlListType */ /*! diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 8ef1bb8faa..e453c61d77 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -362,6 +362,7 @@ public: IsGadget = 0x200, PointerToGadget = 0x400, IsPointer = 0x800, + IsQmlList =0x1000, // used in the QML engine to recognize QQmlListProperty and list }; Q_DECLARE_FLAGS(TypeFlags, TypeFlag) @@ -1070,6 +1071,9 @@ namespace QtPrivate { template struct IsPointerToTypeDerivedFromQObject { enum { Value = false }; }; + template + inline constexpr bool IsQmlListType = false; + template::value> constexpr bool IsUnsignedEnum = false; template @@ -1090,6 +1094,7 @@ namespace QtPrivate { | (IsPointerToGadgetHelper::IsGadgetOrDerivedFrom ? QMetaType::PointerToGadget : 0) | (QTypeInfo::isPointer ? QMetaType::IsPointer : 0) | (IsUnsignedEnum ? QMetaType::IsUnsignedEnumeration : 0) + | (IsQmlListType ? QMetaType::IsQmlList : 0) }; }; diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp index 503e9b0e33..58f1772e91 100644 --- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp +++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp @@ -1093,37 +1093,39 @@ void tst_QMetaType::flags_data() QTest::addColumn("isComplex"); QTest::addColumn("isPointerToQObject"); QTest::addColumn("isEnum"); + QTest::addColumn("isQmlList"); #define ADD_METATYPE_TEST_ROW(MetaTypeName, MetaTypeId, RealType) \ QTest::newRow(#RealType) << MetaTypeId \ << bool(QTypeInfo::isRelocatable) \ << bool(QTypeInfo::isComplex) \ << bool(QtPrivate::IsPointerToTypeDerivedFromQObject::Value) \ - << bool(std::is_enum::value); + << bool(std::is_enum::value) \ + << false; QT_FOR_EACH_STATIC_CORE_CLASS(ADD_METATYPE_TEST_ROW) QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(ADD_METATYPE_TEST_ROW) QT_FOR_EACH_STATIC_CORE_POINTER(ADD_METATYPE_TEST_ROW) #undef ADD_METATYPE_TEST_ROW - QTest::newRow("TestSpace::Foo") << ::qMetaTypeId() << false << true << false << false; - QTest::newRow("Whity") << ::qMetaTypeId >() << true << true << false << false; - QTest::newRow("CustomMovable") << ::qMetaTypeId() << true << true << false << false; - QTest::newRow("CustomObject*") << ::qMetaTypeId() << true << false << true << false; - QTest::newRow("CustomMultiInheritanceObject*") << ::qMetaTypeId() << true << false << true << false; - QTest::newRow("QPair") << ::qMetaTypeId >() << false << true << false << false; - QTest::newRow("QPair") << ::qMetaTypeId >() << false << true << false << false; - QTest::newRow("QPair") << ::qMetaTypeId >() << false << true << false << false; - QTest::newRow("QPair") << ::qMetaTypeId >() << false << true << false << false; - QTest::newRow("QPair") << ::qMetaTypeId >() << true << true << false << false; - QTest::newRow("QPair") << ::qMetaTypeId >() << true << true << false << false; - QTest::newRow("QPair") << ::qMetaTypeId >() << false << true << false << false; - QTest::newRow("QPair") << ::qMetaTypeId >() << true << true << false << false; - QTest::newRow("QPair") << ::qMetaTypeId >() << true << false << false << false; - QTest::newRow("FlagsDataEnum") << ::qMetaTypeId() << true << false << false << true; + QTest::newRow("TestSpace::Foo") << ::qMetaTypeId() << false << true << false << false << false; + QTest::newRow("Whity") << ::qMetaTypeId >() << true << true << false << false << false; + QTest::newRow("CustomMovable") << ::qMetaTypeId() << true << true << false << false << false; + QTest::newRow("CustomObject*") << ::qMetaTypeId() << true << false << true << false << false; + QTest::newRow("CustomMultiInheritanceObject*") << ::qMetaTypeId() << true << false << true << false << false; + QTest::newRow("QPair") << ::qMetaTypeId >() << false << true << false << false << false; + QTest::newRow("QPair") << ::qMetaTypeId >() << false << true << false << false << false; + QTest::newRow("QPair") << ::qMetaTypeId >() << false << true << false << false << false; + QTest::newRow("QPair") << ::qMetaTypeId >() << false << true << false << false << false; + QTest::newRow("QPair") << ::qMetaTypeId >() << true << true << false << false << false; + QTest::newRow("QPair") << ::qMetaTypeId >() << true << true << false << false << false; + QTest::newRow("QPair") << ::qMetaTypeId >() << false << true << false << false << false; + QTest::newRow("QPair") << ::qMetaTypeId >() << true << true << false << false << false; + QTest::newRow("QPair") << ::qMetaTypeId >() << true << false << false << false << false; + QTest::newRow("FlagsDataEnum") << ::qMetaTypeId() << true << false << false << true << false; // invalid ids. - QTest::newRow("-1") << -1 << false << false << false << false; - QTest::newRow("-124125534") << -124125534 << false << false << false << false; - QTest::newRow("124125534") << 124125534 << false << false << false << false; + QTest::newRow("-1") << -1 << false << false << false << false << false; + QTest::newRow("-124125534") << -124125534 << false << false << false << false << false; + QTest::newRow("124125534") << 124125534 << false << false << false << false << false; } void tst_QMetaType::flags() @@ -1133,12 +1135,14 @@ void tst_QMetaType::flags() QFETCH(bool, isComplex); QFETCH(bool, isPointerToQObject); QFETCH(bool, isEnum); + QFETCH(bool, isQmlList); QCOMPARE(bool(QMetaType::typeFlags(type) & QMetaType::NeedsConstruction), isComplex); QCOMPARE(bool(QMetaType::typeFlags(type) & QMetaType::NeedsDestruction), isComplex); QCOMPARE(bool(QMetaType::typeFlags(type) & QMetaType::RelocatableType), isMovable); QCOMPARE(bool(QMetaType::typeFlags(type) & QMetaType::PointerToQObject), isPointerToQObject); QCOMPARE(bool(QMetaType::typeFlags(type) & QMetaType::IsEnumeration), isEnum); + QCOMPARE(bool(QMetaType::typeFlags(type) & QMetaType::IsQmlList), isQmlList); } void tst_QMetaType::flagsStaticLess_data() -- cgit v1.2.3