2012-06-29 8 views
8

Mein Projekt besteht aus einer App, die mit zwei statischen Bibliotheken verknüpft ist. Jede der Bibliotheken deklariert Q_DECLARE_METATYPE<QUuid>, um QUuid mit QVariant zu verwenden, was zu einem 'redefinition of struct QMetaTypeId<QUuid>' Fehler führt.So vermeiden Sie doppelte Deklarationen von Q_DECLARE_METATYPE <aCommonType>

Was ist der richtige Weg, um dies zu tun, während die Möglichkeit bleibt, jede Bibliothek in verschiedenen Projekten zu verwenden?

+1

Ich verstehe nicht, warum Sie "Neudefinition von Struct 'QUuid'" nicht bekommen haben. Nur der Autor von "QUuid" sollte diese Metatyp-ID deklarieren. Sonst ist es nur eine Frage der Zeit, bis Sie auf dieses Problem stoßen. –

+0

@ JohannesSchaub-litb QUuid wird in Qt-Headern deklariert. Ich habe keine Kontrolle über diesen Code, aber ich möchte diesen Typ immer noch in QVariant verwenden. – szayat

Antwort

4

Als Workaround können Sie das Makro Q_DECLARE_METATYPE aus den Implementierungsdateien aufrufen, die es benötigen, anstatt es aus den Headerdateien aufzurufen, oder as the documentation suggests, es aus privaten Headern in jeder Bibliothek aufrufen.

Aber weil QUuid speichert seinen Inhalt als QByteArray, die bereits von QVariant unterstützt wird, brauchen Sie nicht Q_DECLARE_METATYPE zu verwenden, die (von Qt 4.8 nur) zu tun:

// QVariant variant; 
// QUuid uuid; 
variant = uuid.toByteArray(); 
uuid = variant.toByteArray(); 

oder die gleiche Sache, aber etwas weniger effizient, mit QString (vor Qt 4.8):

variant = uuid.toString(); 
uuid = variant.toString(); 

und da QVariant konvertiert implizit zwischen QString und QByteArray, können Sie problemlos toString und toByteArray mischen.

+0

Was sind die genauen Kriterien für Implementierungsdateien, die 'Q_DECLARE_METATYPE' benötigen? Ich habe es zu allen Dateien hinzugefügt, die QUuid in/aus einem QVariant setzen, und alle Dateien, die den QVariant-Typnamen prüfen und darauf reagieren. Dinge scheinen zu funktionieren, keine Kompilierungsfehler und alle Daten scheinen richtig gelesen/geschrieben zu sein. Kann ich mich auf das Fehlen von Kompilierungsfehlern verlassen, um sicherzugehen, dass Q_DECLARE_METATYPE bei Bedarf korrekt deklariert wird? Könnte es theoretisch aufgrund dieser Modifikationen zu stillen Fehlern kommen, QVariant-Werte zu erhalten/zu setzen? – szayat

+0

Beachten Sie, dass ich den Ansatz "QString" oder "QByteArray" nicht verwenden kann, da ich in vielen Teilen meines Codes nicht im Voraus weiß, dass ich ein 'QUuid' erwarte. Ich brauche 'QVariant', um den gespeicherten Wert als' QUuid' identifizieren zu können. – szayat

+0

@szayat Solange Sie 'QUuid' nur mit' QVariant' verwenden, wird bei der Kompilierung zur Laufzeit keine Warnung ausgegeben. Sie würden nur Warnungen erhalten, wenn Sie 'QUuid' als Parameter in einer eingereihten Signal/Slot-Verbindung oder' invokeMethod' vor dem Aufruf von 'qRegisterMetaType' verwenden, oder wenn Sie die' QVariant' mit dem 'QUuid' auf einem' 'serialisieren wollen QDataStream "ohne Aufruf von' qRegisterMetaTypeStreamOperators'. – alexisdm

Verwandte Themen