2012-06-29 58 views
8

我的項目由一個應用程序鏈接到兩個靜態庫。每個庫聲明Q_DECLARE_METATYPE<QUuid>,以便使用QUuidQVariant,這導致'redefinition of struct QMetaTypeId<QUuid>'錯誤。如何避免重複聲明Q_DECLARE_METATYPE <aCommonType>

在保持在不同項目中獨立使用每個庫的能力的同時,正確的方法是什麼?

+1

我不明白你爲什麼沒有得到「重新定義結構'QUUID'」。只有「QUuid」的作者應該聲明該元類型ID。否則,在你遇到這個問題之前,這只是一個時間問題。 –

+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和之間的轉換,你可以混合使用toStringtoByteArray沒有任何問題。

+0

需要'Q_DECLARE_METATYPE'的實現文件的準確標準是什麼?我將它添加到所有設置/從QVariant中獲取QUuid的文件,以及檢查QVariant類型名稱並對其執行操作的所有文件。事情似乎工作,沒有編譯錯誤,所有數據似乎正確地讀/寫。我可以依靠缺少編譯錯誤來確保Q_DECLARE_METATYPE在需要時被正確聲明嗎?理論上,由於這些修改,在獲取/設置QVariant值時是否會出現沉默失敗? – szayat

+0

請注意,我不能使用'QString'或'QByteArray'方法,因爲在我的代碼的很多部分中,事先並不知道我期望使用'QUuid'。我需要'QVariant'能夠將存儲的值識別爲'QUuid'。 – szayat

+0

@szayat只要你在'QVariant'中使用'QUuid',如果它編譯完成,你以後在運行時就不會有任何警告。如果您在調用'qRegisterMetaType'之前將'QUuid'用作排隊信號/插槽連接中的參數或'invokeMethod',或者如果要將包含'QUuid'的'QVariant'序列化爲' QDataStream'沒有調用'qRegisterMetaTypeStreamOperators'。 – alexisdm