1. 程式人生 > >QVariant(相當於是Java裡面的Object,是萬能的容器,但要註冊)

QVariant(相當於是Java裡面的Object,是萬能的容器,但要註冊)

這個型別相當於是Java裡面的Object,它把絕大多數Qt提供的資料型別都封裝起來,起到一個數據型別“擦除”的作用。比如我們的 table單元格可以是string,也可以是int,也可以是一個顏色值,那麼這麼多型別怎麼返回呢?於是,Qt提供了這個QVariant型別,你可以把這很多型別都存放進去,到需要使用的時候使用一系列的to函式取出來即可。比如你把int包裝成一個QVariant,使用的時候要用 QVariant::toInt()重新取出來。這裡需要注意的是,QVariant型別的放入和取出必須是相對應的,你放入一個int就必須按int取出,不能用toString(), Qt不會幫你自動轉換。 資料核心無非就是一個 union,和一個標記型別的type:傳遞的是整數 123,那麼它union儲存整數123,同時type標誌Int;如果傳遞字串,union儲存字串的指標,同時type標誌QString。 QVariant 屬於 Qt 的Core模組,屬於Qt的底層核心之一,ActiveQt、QtScript、QtDeclarative等都嚴重依賴於QVariant。  

QVariant 可以儲存很多Qt的資料型別,包括QBrush、QColor、QCursor、QDateTime、QFont、QKeySequence、 QPalette、QPen、QPixmap、QPoint、QRect、QRegion、QSize和QString,並且還有C++基本型別,如 int、float等。QVariant還能儲存很多集合型別,如QMap<QSTRING, QVariant>, QStringList和QList。item view classes,資料庫模組和QSettings都大量使用了QVariant類,,以方便我們讀寫資料。

  QVariant也可以進行巢狀儲存,例如


QMap<QString, QVariant> pearMap; 
pearMap["Standard"] = 1.95; 
pearMap["Organic"] = 2.25; 

QMap<QString, QVariant> fruitMap; 
fruitMap["Orange"] = 2.10; 
fruitMap["Pineapple"] = 3.85; 
fruitMap["Pear"] = pearMap;

  QVariant被用於構建Qt Meta-Object,因此是QtCore的一部分。當然,我們也可以在GUI模組中使用,例如


QIcon icon("open.png"); 
QVariant variant = icon; 
// other function 
QIcon icon = variant.value<QIcon>();

  我們使用了value()模版函式,獲取儲存在QVariant中的資料。這種函式在非GUI資料中同樣適用,但是,在非GUI模組中,我們通常使用toInt()這樣的一系列to...()函式,如toString()等。

  如果你覺得QVariant提供的儲存資料型別太少,也可以自定義QVariant的儲存型別。被QVariant儲存的資料型別需要有一個預設的建構函式和一個拷貝建構函式。為了實現這個功能,首先必須使用Q_DECLARE_METATYPE()巨集。通常會將這個巨集放在類的宣告所在標頭檔案的下面:


  Q_DECLARE_METATYPE(BusinessCard)

  然後我們就可以使用:


BusinessCard businessCard; 
QVariant variant = QVariant::fromValue(businessCard); 
// ... 
if (variant.canConvert<BusinessCard>()) { 
BusinessCard card = variant.value<BusinessCard>(); 
// ... 
}

  由於VC 6的編譯器限制,這些模板函式不能使用,如果你使用這個編譯器,需要使用qVariantFromValue(), qVariantValue()和qVariantCanConvert()這三個巨集。

  如果自定義資料型別重寫了<<和>>運算子,那麼就可以直接在QDataStream中使用。不過首先需要使用qRegisterMetaTypeStreamOperators().巨集進行註冊。這就能夠讓QSettings使用操作符對資料進行操作,例如

 

https://blog.csdn.net/ok_4444/article/details/38292241