背景
QVariant 可以存储各种数据类型,包括 Qt 中所有内置类型、C++ 中所有基本数据类型,以及自定义类型。
构造函数
QVariant variant_bool(false);
QVariant variant_string(QString("hello"));
QVariant variant_double(3.14);
//...自定义类型支持直接构造
关键成员函数
①.type:获取当前保存的数据类型
QVariant variant;
qDebug() << variant.type();
variant.setValue(3.14);
qDebug() << variant.type();
②.value:获取保存到指定类型的值
QVariant variant(QString("hello"));
qDebug() << variant.value<QString>();
③.canConvert:判断能否将存储的类型转换为指定类型
QVariant variant(3.14);
qDebug() << variant.type();
qDebug() << variant.canConvert<QString>();
④.convert:将存储到类型转换为指定类型
QVariant variant(QString("hello"));
qDebug() << variant.type();
qDebug() << variant.convert(QVariant::Int);
qDebug() << variant;
⑤.isValid:判断是否存储有一个有效值
QVariant variant;
qDebug() << variant.isValid();
variant = QString("hello");
qDebug() << variant.isValid();
基本数据类型读取
①.数据保存
QVariant variant_int(12);
QVariant variant_string = QString("hello");
QVariant variant_bool;
variant_bool.setValue(false);
②.数据读取
QVariant variant_int(12);
QVariant variant_string = QString("hello");
QVariant variant_bool;
variant_bool.setValue(false);
qDebug() << variant_int.toInt();
qDebug() << variant_string.toString();
qDebug() << variant_bool.value<bool>();
自定义数据类型读取
①.注册为元类型
struct MyStruct
{
int id;
QString name;
};
Q_DECLARE_METATYPE(MyStruct)
QVariant variant;
{
MyStruct ms;
ms.id = 1;
ms.name = "hello";
variant.setValue<MyStruct>(ms);
}
MyStruct ms = variant.value<MyStruct>();
qDebug() << ms.id << ms.name;
②.自定义类型转换
struct MyStruct
{
int id;
QString name;
MyStruct() = default;
MyStruct(const QVariant & variant)
{
*this = variant.value<MyStruct>();
}
operator QVariant() const
{
return QVariant::fromValue(*this);
}
};
Q_DECLARE_METATYPE(MyStruct)
QVariant variant;
{
MyStruct ms;
ms.id = 1;
ms.name = "hello";
variant = ms;
}
MyStruct ms = variant;
qDebug() << ms.id << ms.name;
指针类型存取
MyStruct * ms = new MyStruct;
ms->id = 1;
ms->name = "hello";
QVariant variant = QVariant::fromValue(static_cast<void*>(ms));
MyStruct * myStruct = static_cast<MyStruct*>(variant.value<void*>());
qDebug() << myStruct->id << myStruct->name;
QVariantMap
①.概述
在 QVariantMap 头文件中有如下定义:typedef QMap<QString,QVariant> QVariantMap,即 QVariantMap 是一个类型别名。
②.代码示例
QVariantMap config;
config["id"] = 10;
config["name"] = QString("hello");
qDebug() << config["id"].toInt();
qDebug() << config["name"].toString();