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, qstringlist和qlist。item view classes,資料庫模組和qsettings都大量使用了qvariant類,,以方便我們讀寫資料。
qvariant也可以進行巢狀儲存,例如
1 qmappearmap;2 pearmap["
standard
"] = 1.95
;
3 pearmap["
organic
"] = 2.25
;
45 qmapfruitmap;
6 fruitmap["
orange
"] = 2.10
;
7 fruitmap["
"] = 3.85
;
8 fruitmap["
pear
"] = pearmap;
qvariant被用於構建qt meta-object,因此是qtcore的一部分。當然,我們也可以在gui模組中使用,例如
qicon icon("open.png");我們使用了value()模版函式,獲取儲存在qvariant中的資料。這種函式在非gui資料中同樣適用,但是,在非gui模組中,我們通常使用toint()這樣的一系列to...()函式,如tostring()等。qvariant variant = icon;
// other function
qicon icon = variant.value();
如果你覺得qvariant提供的儲存資料型別太少,也可以自定義qvariant的儲存型別。被qvariant儲存的資料型別需要有乙個預設的建構函式和乙個拷貝建構函式。為了實現這個功能,首先必須使用q_declare_metatype()巨集。通常會將這個巨集放在類的宣告所在標頭檔案的下面(q_declare_metatype(myclass)巨集的位置:標頭檔案,類宣告後):
1要使用乙個自定義型別可用於qvariant中只需要在類宣告的後面加上:q_declare_metatype(),
2struct
myclass37
q_declare_metatype(myclass)89
10這樣我們的類就可以像qmetatype::type類一樣使用沒什麼不同,有點不同的是使用方法上面只能這樣使用.
11myclass myclass;
12 qvariant v3 =qvairant::fromvalue(myclass);
13//
14 v2.canconvert();
15 myclass myclass2 = v2.value();
例如:q_declare_metatype(businesscard)
然後我們就可以使用:
1businesscard businesscard;
2 qvariant variant =qvariant::fromvalue(businesscard); 3//
...
4if (variant.canconvert())
由於vc 6的編譯器限制,這些模板函式不能使用,如果你使用這個編譯器,需要使用qvariantfromvalue(), qvariantvalue()和qvariantcanconvert()這三個巨集。
如果自定義資料型別重寫了《和》運算子,那麼就可以直接在qdatastream中使用。不過首先需要使用qregistermetatypestreamoperators().巨集進行註冊。這就能夠讓qsettings使用操作符對資料進行操作,例如qregistermetatypestreamoperators("businesscard");
**:qvariant與自定義資料型別轉換的方法
在使用vc、delphi編寫使用者介面程式的時候,經常會把物件與控制項的data域進行繫結,便於程式執行中讀寫提高效率。然而在qt程式設計中怎麼實現這個功能呢?比如將乙個使用者自定義的結構體與qcombobox控制項的data繫結?
qt的聯機幫助做的實在是差強人意,示例**太少了。除錯了半天,看到這篇文章給了我提示。主要步驟如下:
1、將自定義資料型別使用q_declare_metatype巨集進行宣告,便於編譯器識別。
2、在插入物件的時候,宣告qvariant物件,使用其setvalue方法新增自定義物件。
3、在讀取的時候,採用qvariant物件的value方法返回自定義物件。
示例**如下:
1、自定義結構體及元型別宣告:
1struct
mystruct
2;
6mystruct stu;
78 q_declare_metatype(mystruct)
2、在程式初始化中,給結構體初始化並儲存到qcombobox的data域中:
1 bzero(&stu, sizeof(mystruct)); //stu就是上面宣告的全域性變數 2//
賦初值
3 stu.a = 100
; 4 strcpy(stu.b,"
hello./n
"); 5//
型別轉換
6qvariant v;
7 qstring ss = qstring("%1"
).arg(stu.b);
8v.setvalue(stu); 9//
儲存到控制項data中
10 ui->cbotest->additem(ss, v);
11 ui->cbotest->additem("
aadkjf
", 0);
3、讀取的時候反過來處理,如下:
1qvariant v; 2//
從控制項data域取得variant物件
3 v = ui->cbotest->itemdata(0
); 4//
轉換為自定義的結構體例項
5 mystruct s = v.value();
6 printf("
value=%d:%s/n
",s.a, s.b);
**:
自定義資料型別
include include using namespace std typedef double weight,tall struct student int main cout for int i 0 i 4 i return 0 貼上正確的輸出 這裡tall和weight都是自己可以輸入的 ...
自定義資料型別 列舉型別
學習了乙個月c語言,卻從來沒有更新過部落格,沒有總結的學習是不完整的。好了,其實我是走c 方向的,就提前看了c 的有關內容。c 除了和c語言一樣常用的資料型別,他們還有允許使用者自己來設計的一些資料型別,比如列舉型資料,結構型資料和鍊錶。我就簡單的總結下列舉型別。列舉型別允許使用者自己來定義一種資料...
自定義資料型別 結構型別
c 中自定義資料型別還有一種稱為結構型別,並且把該型別的各種資料型別一一整合到其中。學號 型別 姓名 字串 學生年齡 整型 院系 字串 平均成績 浮點型 每個學生的資訊成為了乙個整體,雜亂的資料和每個學生一一對應了起來,方便管理。如果需要建立學生型別,就可以這樣寫。include using nam...