QVariant(相當於是Java裡面的Object,是萬能的容器,但要註冊)
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