QVariant与自定义类型互转之奇巧淫技

一、看图说话

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,即可下载。

在这里插入图片描述

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值