2.3 QVariant类
一.QVariant类
QVariant类非常类似于C语言或C++语言中的union(联合)类型,在这里我们先复习一下这个联合类型,实际上,联合类型是一种多个成员之间共用同一块内存空间的现象,假设我们的某个联合体里面有两个成员,int和double,那么如果我们对该联合体进行取sizeof,我们会发现其占用的字节数就是double的字节数,也就是8字节(见下面的代码,大家可以自己去试一试)
#include<stdio.h>
union MyUnion//我们自己定义一个联合体
{
int a;//int类型的成员
double b;//double类型的成员
};
int main()
{
printf("sizeof(MyUnion)=%d\n",sizeof(union MyUnion));
return 0;
}
/*
总结:在一个联合体中,如果所有的成员各自占的字节数都是一样的(比如说大家都是4字节,那么这个联合体最终的字节就是4字节;如果大家都不一样大,那么最终的字节数就取整个联合体里面占用字节数最大的那个成员)
*/

然后,我们这里开始介绍Qt中的QVariant类,实际上我们刚刚说了,这个类很像C或C++中的联合体,除此之外它还有类似容器的功能(只不过它能放的类型并不像真正的Qt容器那样的多,这个QVariant类可以放QColor,QBrush,QFont,QPen,QRect,QString,QSize,C和C++语言的所有的基本数据类型的数据(它本身也可以放容器[注意:是用QVariant类的对象来放已经初始化了的容器,并不是用Qt的容器来放QVariant类型的数据]))
二.QVariant类的使用
2.1 我们仍然还是在Qt Creator中建立一个Qt Console Application的项目,来使用一下这个类
#include<QCoreApplication>
#include<QVariant>
#include<QString>
#include<QList>
#include<QColor>
#include<QMap>
#include<QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//QVariant可以存所有的C和C++语言中的所有的基本数据类型
QVariant v1(447);//放整数
QVariant v2(3.1415926);//放浮点数
QVariant v3('H');//放字符
QVariant v4("Hello,QVariant!");//放字符串
QVariant v5(true);//放bool类型
///然后我们可以输出它们
qDebug()<<v1;//如果我们直接输出就是:QVariant(int, 447)
qDebug()<<v2;//QVariant(double,3.1415926)
qDebug()<<v1.toString();//还可以转为字符串的整数来使用
qDebug()<<v1.toInt();//还可以取到里面的数据(前提是你明确刚刚你定义的时候传入的类型是什么)
qDebug()<<v3.toString();//转为QString的字符串输出
//将QVariant放到容器中使用(其实通过这个例子我们可以感受到,QVariant在某种程度上统一了Qt中的数据类型
QMap<QString,QVariant>map;
map.insert("int",999);
map.insert("QString",QString("Hello,World!"));
map.insert("double",3.1415);
//我们还可以使用这种插入键值对的方式来使用map容器
map["Hello"] = "World!";//这个相当于以"Hello"为键,"World!"为值的键值对
///然后我们可以输出他们
for(QMap<QString,QVariant>::iterator it=map.begin();it!=map.end();it++)
{
qDebug()<<it.key() << ":" << it.value();
}
///关于QVariant的一些常用的成员方法的使用
//获取放入QVariant类的变量的类型
qDebug()<<v1.type();//实际上这个Type方法返回的类型是QVariant里面定义的一些类型,比如QVariant::int(实际上这
///是一些枚举
//因此可以这样子用
if(v1.type()==QVariant::Int)
{
qDebug()<<"v1的具体类型是Int哦";
}
if(v2.type()==QVariant::Double)
{
qDebug()<<"v2的具体类型是Double哦";
}
//这样子也可以
QStringList sl;
sl<<"A"<<"B"<<"C"<<"D";
//然后我将其存入到一个QVariant对象中
QVariant vs(sl);
if(vs.type()==QVariant::StringList)
{
QStringList list = vs.toStringList();
for(auto elem:list)
{
qDebug()<<elem;
}
}
return a.exec();
}
这里我整理了一些QVariant对应的枚举的一些类型(这些类型也是可以用来做QVariant的构造函数的一些类型)
1.QVariant所支持的基本数据类型
| QVariant枚举的类型 | 对应的实际的类型 | QVariant枚举的类型 | 对应的实际的类型 |
| QVariant::Invalid | 无效类型 | QVariant::Time | QTime |
| QVariant::Region | QRegion | QVariant::Line | QLine |
| QVariant::Bitmap | QBitmap | QVariant::Palette | QPalette |
| QVariant::Bool | bool | QVariant::List | QList |
| QVariant::Brush | QBrush | QVariant::SizePolicy | QSizePolicy |
| QVariant::Size | QSize | QVariant::String | QString |
| QVariant::Char | QChar | QVariant::Map | QMap |
| QVariant::Color | QColor | QVariant::StringList | QStringList |
| QVariant::Cursor | QCursor | QVariant::Point | QPoint |
| QVariant::Date | QDate | QVariant::Pen | QPen |
| QVariant::DateTime | QDateTime | QVariant::Pixmap | QPixmap |
| QVariant::Double | double | QVariant::Rect | QRect |
| QVariant::Font | QFont | QVariant::Image | QImage |
| QVariant::Icon | QIcon | QVariant::UserType | 用户自定义类型 |
2.总结
QVariant类虽然类似于联合体类型,但是通过本节我们看到了,它在某种程度上统一了Qt中的数据类型,使得这些数据类型和数据类型之间的关系更加密切,实际上QVariant类是几乎是一些Qt基础类的支柱

浙公网安备 33010602011771号