QT中的Q_DECLARE_METATYPE介紹及遇到的編譯錯誤

  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所識別。那該怎樣識別呢?spa

  這就要用到宏定義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)的形式來進行註冊。須要注意的一點是當自定義的類或結構體在命名空間內時,須要在命名空間結束時指定命名空間。code

以下例中的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類型,而未能識別其指針類型!!!blog

另外自定義類型中必定要有默認構造函數,若是已經顯式的定義了帶有無默認參數的構造函數則須要另外寫上默認構造函數 Test(){}。get

還有爲保證不出其餘莫名其妙的錯誤,最好在類定義的頭文件中加上#include <QVariant>,保證編譯器可以識別該宏。編譯器

相關文章
相關標籤/搜索