一、看图说话
QVariant原本就支持了很多的类型,如int、double、QString、QSize等。
那么,如何让QVariant支持自定义类型。
只需使用一条Q_DECLARE_METATYPE,将类型定义为元数据类型,即可。
struct Student
{
QString name;
int age;
};
Q_DECLARE_METATYPE(Student)
定义2个测试函数
void setVariant(const QVariant& value)
{
qDebug() << "setVariant";
}
void setStudent(const Student& stu)
{
qDebug() << "setStudent" << stu.name << stu.age;
}
自定义类型与QVariant互转
Student stu1;
stu1.name = "hh";
stu1.age = 10;
// 自定义类型转QVariant
QVariant variant;
variant.setValue<Student>(stu1);
setVariant(variant);
// QVariant转自定义类型
Student stu2;
stu2 = variant.value<Student>();
setStudent(stu2);
神马,你说这样太麻烦,好。
自定义类型转QVariant,还有一个函数,可以直接转,如下:
setVariant(QVariant::fromValue(stu1));
好,继续。
我们在Student结构体中添加一个函数,如下:
struct Student
{
QString name;
int age;
operator QVariant() const
{
return QVariant::fromValue(*this);
}
};
Q_DECLARE_METATYPE(Student)
就可以使用,更加简单的,自定义类型转QVariant,如下:
setVariant(stu1);
另外,我们再在Student结构体中添加1个构造函数Student(const QVariant& variant),如下:
struct Student
{
QString name;
int age;
operator QVariant() const
{
return QVariant::fromValue(*this);
}
Student() {}
Student(const QVariant& variant)
{
*this = variant.value<Student>();
}
};
Q_DECLARE_METATYPE(Student)
又可以使用,更加简单的,QVariant转自定义类型,如下:
setStudent(variant);
以上2种类型转换方式,原理,可参考《c++ 中 operator 使用小结》。
二、总结
Student stu1;
stu1.name = "hh";
stu1.age = 10;
// 自定义类型转QVariant,用法1
QVariant variant;
variant.setValue<Student>(stu1);
setVariant(variant);
// 自定义类型转QVariant,用法2
setVariant(QVariant::fromValue(stu1));
// 自定义类型转QVariant,用法3
setVariant(stu1); // 需要在结构体添加operator QVariant() const函数
// QVariant转自定义类型,用法1
Student stu2;
stu2 = variant.value<Student>();
setStudent(stu2);
// QVariant转自定义类型,用法2
setStudent(variant); // 需要在结构体添加Student(const QVariant& variant)构造函数
具体用哪种,请各位客官大老爷,自行选择。
若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!
同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。
本文涉及工程代码,公众号回复:44QVariantStruct,即可下载。