Qt中QVariant是多種類型的聯合,QVariant類中有個SetValue(T& value)方法,將自定義 T 類型的數據保存到QVariant對象中,可以理解為是自定義類型被封裝成了QVariant的形式,這樣,我們自定義的T類型的對象就能夠通過所有參數和返回值為QVarian類型傳遞。比如QTableWidgetItem的setData(int column,QVariant& data)和QTreeWidgetItem的setData(int column,int role,QVariant& data)等,通過setData函數我們可以為每個單元格保存自己想綁定的數據及為每個樹節點保存想綁定的自定義類型的數據。
但是,QVariant中的setValue方法的使用有個前提,就是我們自定義的類型要能被Qt所識別。那該怎樣識別呢?
這就要用到宏定義Q_DECLARE_METATYPE了,通過這個宏定義可以將自定義的類型注冊到Qt的元類型中,從而被Qt識別,通常在自定義類型定義之后使用。
1 struct Test 2 { 3 int id; 4 QString name; 5 }; 6
7 Q_DECLARE_METATYPE(Test)
通過Q_DECLARE_METATYPE(Type)的形式來進行注冊。需要注意的一點是當自定義的類或結構體在命名空間內時,需要在命名空間結束時指定命名空間。
如下例中的A::Test
nameSpace A { struct Test { int id; QString name; }; } Q_DECLARE_METATYPE(A::Test)
今天遇到了莫名其妙的編譯錯誤,原因是我用QVariant設置一個自定義指針類型的Data,這時就需要Q_DECLARE_METATYPE(Type*)了,如果設置了Q_DECLARE_METATYPE(Type),Qt只能識別Type類型,而未能識別其指針類型!!!
另外自定義類型中一定要有默認構造函數,如果已經顯式的定義了帶有無默認參數的構造函數則需要另外寫上默認構造函數 Test(){}。
還有為保證不出其他莫名其妙的錯誤,最好在類定義的頭文件中加上#include <QVariant>,保證編譯器能夠識別該宏。