试想我们的 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的数据类型,包括QBrush、QColor、QDateTime、QPixmap、QPoint和QString,并且还有C++基本类型,如 int、float等。QVariant还能保存很多集合类型,如QMap<QString, QVariant>, QStringList和QList。item view classes,数据库模块和QSettings都大量使用了QVariant类,以方便我们读写数据。
示例:
1.基本数据类型使用
int
QVariant var;
var.setValue(123); //存
int nvar ;
nvar = var.value<int>();//取
QString
QVariant var2;
var2.setValue(QString("world"));//存
QString strValue;
strValue = var2.value<QString>();//取
2.QIcon等类使用
QIcon icon("open.png");
QVariant var3 = icon; //存
QIcon iconValue = var3.value<QIcon>();//取
3.自定义结构体使用
struct flyData
{
int id;
QString name;
};
Q_DECLARE_METATYPE(flyData);//重点
void xvalidator::slotSend()
{
flyData temp;
temp.id = 1;
temp.name = "test";
QVariant data;
data.setValue(temp); //保存数据
Receive( data);
}
void xvalidator::Receive(QVariant data)
{
flyData da = data.value<flyData>(); //获取数据
}