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还能保存很多集合类型,如QMapQSTRING,QVariant,QStringList和QList。itemviewclasses,数据库模块和QSettings都大量使用了QVariant类,,以方便我们读写数据。 QVariant也可以进行嵌套存储,例如1QMapQString,QVariantpearMap;2pearMap〔Standard〕1。95;3pearMap〔Organic〕2。25;45QMapQString,QVariantfruitMap;6fruitMap〔Orange〕2。10;7fruitMap〔Pineapple〕3。85;8fruitMap〔Pear〕pearMap; QVariant被用于构建QtMetaObject,因此是QtCore的一部分。当然,我们也可以在GUI模块中使用,例如QIconicon(open。png);QVariantvarianticon;otherfunctionQIconiconvariant。valueQIcon(); 我们使用了value()模版函数,获取存储在QVariant中的数据。这种函数在非GUI数据中同样适用,但是,在非GUI模块中,我们通常使用toInt()这样的一系列to。。。()函数,如toString()等。 如果你觉得QVariant提供的存储数据类型太少,也可以自定义QVariant的存储类型。被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用QDECLAREMETATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面(QDECLAREMETATYPE(MyClass)宏的位置:头文件,类声明后):1要使用一个自定义类型可用于QVariant中只需要在类声明的后面加上:QDECLAREMETATYPE(),2structMyClass3{4QStringname;5intage;6}7QDECLAREMETATYPE(MyClass)8910这样我们的类就可以像QMetaType::Type类一样使用没什么不同,有点不同的是使用方法上面只能这样使用。11MyClassmyClass;12QVariantv3QVairant::fromValue(myClass);1314v2。canConvertMyClass();15MyClassmyClass2v2。valueMyClass(); 例如: QDECLAREMETATYPE(BusinessCard) 然后我们就可以使用:1BusinessCardbusinessCard;2QVariantvariantQVariant::fromValue(businessCard);3。。。4if(variant。canConvertBusinessCard()){5BusinessCardcardvariant。valueBusinessCard();6。。。7} 由于VC6的编译器限制,这些模板函数不能使用,如果你使用这个编译器,需要使用qVariantFromValue(),qVariantValue()和qVariantCanConvert()这三个宏。 如果自定义数据类型重写了和运算符,那么就可以直接在QDataStream中使用。不过首先需要使用qRegisterMetaTypeStreamOperators()。宏进行注册。这就能够让QSettings使用操作符对数据进行操作,例如qRegisterMetaTypeStreamOperators(BusinessCard); 转自:http:blog。csdn。netzhangbinsijifengarticledetails50686753 QVariant与自定义数据类型转换的方法 在使用VC、Delphi编写用户界面程序的时候,经常会把对象与控件的data域进行绑定,便于程序运行中读写提高效率。然而在Qt编程中怎么实现这个功能呢?比如将一个用户自定义的结构体与QComboBox控件的data绑定? 点击领取Qt学习资料视频教程链接 Qt的联机帮助做的实在是差强人意,示例代码太少了。调试了半天,看到这篇文章给了我提示。主要步骤如下: 1、将自定义数据类型使用QDECLAREMETATYPE宏进行声明,便于编译器识别。 2、在插入对象的时候,声明QVariant对象,使用其setValue方法添加自定义对象。 3、在读取的时候,采用QVariant对象的value方法返回自定义对象。 示例代码如下: 1、自定义结构体及元类型声明:1structMyStruct2{3inta;4charb〔10〕;5};6MyStructstu;78QDECLAREMETATYPE(MyStruct) 2、在程序初始化中,给结构体初始化并存储到QComboBox的data域中:1bzero(stu,sizeof(MyStruct));stu就是上面声明的全局变量2赋初值3stu。a100;4strcpy(stu。b,Hello。n);5类型转换6QVariantv;7QStringssQString(1)。arg(stu。b);8v。setValue(stu);9保存到控件data中10uicboTestaddItem(ss,v);11uicboTestaddItem(aadkjf,0); 3、读取的时候反过来处理,如下:1QVariantv;2从控件data域取得variant对象3vuicboTestitemData(0);4转换为自定义的结构体实例5MyStructsv。valueMyStruct();6printf(valued:sn,s。a,s。b); 转自:http:blog。csdn。netderryzhangarticledetails5114491