QT中的 QVariant 变量

1. union联合体

union是c++中的一个类型,与struct看起来很像,但是用法却完全不同。
union中的各个成员变量共享一块内存区域,对任何一个成员变量的修改都会影响其他成员变量的值。
下面是一个演示案例:

union Data
{
    int i;
    double d;
};

int main( int /*argc*/, char** /*argv*/)
{
    Data d;
    d.i = 10;
    printf("%d\n", d.i );
    printf("%g\n", d.d );

    d.d = 10;
    printf("%d\n", d.i );
    printf("%g\n", d.d );
}

输出的结果为:

10
6.95251e-310
0
10

2. Qt 中的 QVariant变量

QVariant包含了一个uniontype字段,union字段可以存储不同类型的数据,type可以记录实际数据的类型。
储存自定义类需要通过Q_DECLARE_METATYPE来声明。

使用案例:

//自定义类型
class Agent {
  public:
    int id;
    QPoint pos;
};

struct CarPos {
    int x;
    int y;
};

//注册为元类型
Q_DECLARE_METATYPE(Agent)
Q_DECLARE_METATYPE(CarPos)

int main( int /*argc*/, char** /*argv*/)
{
    QVariant variant(42);
    qDebug() << variant.typeName(); // int
    qDebug() << variant.toInt(); // 42

    variant.setValue(QString("yes"));
    qDebug() << variant; // QVariant(QString, "yes")

    variant.setValue(4.17);
    qDebug() << variant; // QVariant(double, 4.17)

    variant.setValue(QPoint(2,2));
    qDebug() << variant; // QVariant(QPoint, QPoint(2,2))

	variant.setValue(Agent {0, QPoint(1,1)});
    qDebug() << variant.typeName(); // Agent
    qDebug() << "id:" << variant.value<Agent>().id << ",pos:" << variant.value<Agent>().pos; // id: 0 ,pos: QPoint(1,1)
    
    variant.setValue(CarPos{2,2});
    qDebug() << variant.typeName(); // CarPos
    qDebug() << "x:" <<variant.value<CarPos>().x << ",y:" << variant.value<CarPos>().y; // x: 2 ,y: 2

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值