1. QVariant介绍
QVariant是一个十分强大的类,它在Qt中被用来存储兼容类型、对象以及结构体。在这里我们假设要将一些复杂的结构体数据转换为QVariant
2.存储自定义的结构体
假设你已经定义了一个名为MyStruct的类,它拥有以下属性:
class MyStruct
{
public:
QString name;
int age;
QList<QDateTime> eventTimes;
// 其余代码...
};
将该类注册为qt的元对象系统中
Q_DECLARE_METATYPE(MyStruct)
现在需要将该结构体实例转换为QVariant,可以使用QVariant::fromValue()方法进行,如下所示:
MyStruct myStructObject; // 实例化一个MyStruct对象,并进行赋值操作
// 将这个实例包装到一个 QVariant 对象里面。
QVariant myVariant = QVariant::fromValue(myStructObject);
通过这段代码,QVariant对象myVariant 中会包含我们刚才创建的结构体对象myStructObject 的值,当我们再需要访问MyStruct信息时,可以通过调用QVariant的value()函数轻松地将其还原成原始的数据类型:
MyStruct retrievedData = myVariant.value<MyStruct>();
3. QVariantList
如何将一个列表数据存储到QVariant对象,这就需要用到QVariantList
加入定义了一个结构体
class CustomStruct
{
public:
QString name;
int age;
QList<QDateTime> eventTimes;
// 其余代码...
};
Q_DECLARE_METATYPE(CustomStruct*)
// 1. 要包装 QList<CustomStruct*> customStructList指针,请首先转换为 QVariantList 类型。
QVariantList varList;
foreach (customStruct* elem, customStructList) {
varList.append(QVariant::fromValue<customStruct*>(elem));
}
// 2. 然后将 QVariantList 存储为 QVariant 类型以便传递给其它函数。
QVariant variant;
variant.setValue(varList);
// 3. 如果需要还原 QList<CustomStruct*> 对象,则可以通过以下方式进行:
QVariantList varList = variant.value<QVariantList>();
QList<CustomStruct*> customStructList;
foreach (const QVariant& var , varList) {
CustomStruct* detailInfo = var.value<CustomStruct*>();
if (detailInfo) {
customStructList.push_back(detailInfo);
}
}