2012-06-29 4 views
8

Мой проект состоит из приложения, которое ссылается на две статические библиотеки. Каждая из библиотек объявляет Q_DECLARE_METATYPE<QUuid>, чтобы использовать QUuid с QVariant, что приводит к ошибке 'redefinition of struct QMetaTypeId<QUuid>'.Как избежать дублирования объявлений Q_DECLARE_METATYPE <aCommonType>

Каков правильный способ этого, сохраняя при этом возможность использовать каждую библиотеку самостоятельно в разных проектах?

+1

Я не понимаю, почему вы не получили «переопределение структуры« QUuid ». Только автору «QUuid» следует объявить этот идентификатор метатипа. В противном случае это только вопрос времени, пока вы не столкнетесь с этой проблемой. –

+0

@ JohannesSchaub-litb QUUID объявлен в заголовках Qt. У меня нет контроля над этим кодом, но я все еще хочу использовать этот тип в QVariant. – szayat

ответ

4

В качестве обходного пути вы можете вызвать макрос Q_DECLARE_METATYPE из файлов реализации, которые ему нужны, вместо того, чтобы вызывать его из файлов заголовков, или as the documentation suggests, вызывать его из частных заголовков в каждой библиотеке.

Но поскольку QUuid хранит его содержание как QByteArray, который уже поддерживается QVariant, вам не нужно использовать Q_DECLARE_METATYPE, чтобы сделать это (из Qt 4.8 только):

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

или одно и то же, но немного менее эффективно, с QString (до Qt 4.8):

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

и так QVariant неявно конвертировать между QString и QByteArray, вы можете смешать toString и toByteArray без проблем.

+0

Каковы точные критерии для файлов реализации, которые нуждаются в 'Q_DECLARE_METATYPE'? Я добавил его ко всем файлам, которые устанавливают/получают QUuid в/из QVariant, а также все файлы, которые проверяют имя типа QVariant и действуют на него. Кажется, что все работает, нет ошибок компиляции, и все данные, кажется, читаются/записываются правильно. Могу ли я полагаться на отсутствие ошибок компиляции, чтобы убедиться, что Q_DECLARE_METATYPE правильно объявлен всякий раз, когда это необходимо? Теоретически, могут ли быть молчащие сбои в получении/установке значений QVariant из-за этих изменений? – szayat

+0

Обратите внимание, что я не могу использовать подход 'QString' или' QByteArray', поскольку во многих частях моего кода я заранее не знаю, что я ожидаю 'QUuid'. Мне нужно 'QVariant', чтобы иметь возможность идентифицировать сохраненное значение как' QUuid'. – szayat

+0

@szayat До тех пор, пока вы используете 'QUuid' с' QVariant', если он компилируется, у вас не будет никаких предупреждений позже во время выполнения. Вы получили бы предупреждения только в том случае, если вы использовали 'QUuid' в качестве параметра в очереди с сигналом/слотом или' invokeMethod' перед вызовом 'qRegisterMetaType', или если вы хотите сериализовать' QVariant', содержащий 'QUuid', на' QDataStream' без вызова 'qRegisterMetaTypeStreamOperators'. – alexisdm