这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用。比如我们的 table单元格可以是string,也可以是int,也可以是一个颜色值,那么这么多类型怎么返回呢?于是,Qt提供了这个QVariant类型,你可以把这很多类型都存放进去,到需要使用的时候使用一系列的to函数取出来即可。比如你把int包装成一个QVariant,使用的时候要用 QVariant::toInt()重新取出来。这里需要注意的是,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<QSTRING, QVariant>, QStringList和QList。item view classes,数据库模块和QSettings都大量使用了QVariant类,,以方便我们读写数据。
QVariant类作为一个最为普遍的Qt数据类型的联合。
因为c++禁止没有构造函数和析构函数的联合体,许多继承的Qt类不能够在联合体当中使用。(联合体当中的变量共用一个存储区),没有了联合变量,我们在物体属性以及数据库的工作等方面受到很多的困扰。
一个QVariant对象在一个时间内只保留一种类型的值。我们可以使用canConvert来查询是否能够转换当前的类型。转换类型一般以toT()命名.
摘录了一个example来说明QVariant的使用方法:
QVariant v1(15);
qDebug() << v1.toInt(); // 结果为15
QVariant v2(12.3);
qDebug() << v2.toFloat(); // 结果为12.3
QVariant v3("nihao");
qDebug() << v3.toString(); // 结果为"nihao"
QColor color = QColor(Qt::red);
QVariant v4 = color;
qDebug() << v4.type(); // 结果为QVariant::QColor
qDebug() << v4.value<QColor>(); // 结果为QColor(ARGB 1,1,0,0)
QString str = "hello";
QVariant v5 = str;
qDebug() << v5.canConvert(QVariant::Int); // 结果为true
qDebug() << v5.toString(); // 结果为"hello"
qDebug() << v5.convert(QVariant::Int); // 结果为false
qDebug() << v5.toString(); // 转换失败,v5被清空,结果为"0"