自定義資料型別使用QVariant轉換的方法

2022-08-27 23:54:17 字數 3627 閱讀 7259

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");   

qvariant variant = icon;

// other function

qicon icon = variant.value();

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

如果你覺得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)

然後我們就可以使用:

1

businesscard 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、自定義結構體及元型別宣告:

1

struct

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、讀取的時候反過來處理,如下:

1

qvariant 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...