2016-12-25 3 views
0

Ich treffe ein Qt Metatype Problem.Qt C++ Metatyp Typflag stimmen nicht überein Problem

Ich habe eine const pointer zu einer Klasse von qobject abgeleitet und unten in QVariant wie setzen will:

QVariant::fromValue(objectPointer) 

ich erklärt haben, den Meta-Typen der abgeleiteten Klasse mit: Q_DECLARE_METATYPE(const QDrivedClass *) in der Header-Datei (.h) der abgeleiteten Klasse.

Aber während der Laufzeit, ich unten eine Fehlermeldung anzeigt:

QMetaType::registerType: Binary compatibility break. Type flags for type 'const QDrivedClass *' [1093] don't match. Previously registered TypeFlags(0x10c), now registering TypeFlags(0x104). 

ich das ganze Projekt überprüft und dort eine Zeile Code sind zu finden unter Fall kann dieses Problem:

qRegisterMetaType<T *>(QByteArray("const ") + QByteArray(T::staticMetaObject.className()) + 
        QByteArray("*")); 

Wenn ich Kommentar oben Code, das Typeflag Mismatch-Problem wird behoben. Aber es wird ein anderes Problem verursachen, da wir Signal/Slot der abgeleiteten Klasse verwenden müssen.

Kann mir jemand einen Rat geben, warum die qRegisterMetaType und Q_DECLARE_METATYPE verschiedene Typen Flags für den const Zeiger auf eine Klasse haben, die von QObject abgeleitet ist und wie man es repariert?

+1

Sie mischen const und nicht-const Typen in Ihrem qRegisterMetaType-Aufruf, der, denke ich, keine gute Idee ist. – E4z9

+0

Wie dem auch sei, die Typ-Flags scheinen "beweglich + Zeiger auf QObject" zu sein, und die anderen nur "beweglich". Hat Ihre abgeleitete Klasse in ihrer Deklaration ein Makro 'Q_OBJECT'? – E4z9

+0

Ja, die Klasse drived hat in ihrer Deklaration ein Makro Q_OBJECT. Und das Laufwerkobjekt wird in eine DLL exportiert. –

Antwort

0

E4z9, danke für das Aufzeigen der Mischung der const und nicht-const Typen.

Das ist die Ursache für das Typenkonfliktproblem.

änderte ich den Code wie folgt:

qRegisterMetaType <const T *> (QByteArray("const ") + QByteArray(T::staticMetaObject.className()) + QByteArray("*")); 

Typdiskrepanz Problem dann repariert.

+0

großartig, dass Sie das Problem gefunden haben – E4z9

Verwandte Themen