QMetaType: Do not automatically register types that derives from a Q_GADGET

Otherwise the type is registered with the wrong name

Change-Id: I68ec3a05e2528816626e648b46ccc9d70b004866
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
bb10
Olivier Goffart 2015-05-23 14:04:09 +02:00 committed by Olivier Goffart (Woboq GmbH)
parent d0b1c646b4
commit 75af24a2d1
3 changed files with 11 additions and 4 deletions

View File

@ -1357,12 +1357,16 @@ namespace QtPrivate
enum { Value = sizeof(checkType(static_cast<T*>(0))) == sizeof(yes_type) };
};
template<typename T, typename Enable = void>
struct IsGadgetHelper { enum { Value = false }; };
template<typename T>
struct IsGadgetHelper
struct IsGadgetHelper<T, typename T::QtGadgetHelper>
{
template<typename X> static typename X::QtGadgetHelper *checkType(X*);
static char checkType(void*);
enum { Value = sizeof(checkType(static_cast<T*>(0))) == sizeof(void*) };
template <typename X>
static char checkType(void (X::*)());
static void *checkType(void (T::*)());
enum { Value = sizeof(checkType(&T::qt_check_for_QGADGET_macro)) == sizeof(void *) };
};

View File

@ -172,6 +172,7 @@ private: \
#define Q_GADGET \
public: \
static const QMetaObject staticMetaObject; \
void qt_check_for_QGADGET_macro(); \
typedef void QtGadgetHelper; \
private: \
Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);

View File

@ -144,6 +144,7 @@ class CustomGadget {
};
class CustomNonQObject {};
class GadgetDerived : public CustomGadget {};
void tst_QMetaType::defined()
{
@ -153,6 +154,7 @@ void tst_QMetaType::defined()
QCOMPARE(int(QMetaTypeId2<int*>::Defined), 0);
QCOMPARE(int(QMetaTypeId2<CustomQObject::CustomQEnum>::Defined), 1);
QCOMPARE(int(QMetaTypeId2<CustomGadget>::Defined), 1);
QVERIFY(!QMetaTypeId2<GadgetDerived>::Defined);
QVERIFY(int(QMetaTypeId2<CustomQObject*>::Defined));
QVERIFY(!QMetaTypeId2<CustomQObject>::Defined);
QVERIFY(!QMetaTypeId2<CustomNonQObject>::Defined);