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基础类的支柱

posted @ 2023-07-10 22:03  蜡笔小新Pointer  阅读(162)  评论(0)    收藏  举报