QVariant类应用 和 Q_DECLARE_METATYPE说明

 QVariant

         QVariant 类本质为 C++联合(Union)数据类型,它可以保存很多Qt 类型的值,包括 QBrush、QColor、QString 等等。也能够存放Qt 的容器类型的值。
        QVariant::StringList 是 Qt 定义的一个 QVariant::type 枚举类型的变量,其他常用的枚举类型变量如下表所示:

             变量   对应的类型               变量    对应的类型
QVariant::Invalid无效类型QVariant::TimeQTime
QVariant::RegionQRegionQVariant::LineQLine
QVariant::BitmapQBitmapQVariant::PaletteQPalette
QVariant::BoolboolQVariant::ListQList
QVariant::BrushQBrushQVariant::SizePolicyQSizePolicy
QVariant::SizeQSizeQVariant::StringQString
QVariant::CharQCharQVariant::MapQMap
QVariant::ColorQColorQVariant::StringListQStringList
QVariant::CursorQCursorQVariant::PointQPoint
QVariant::DateQDateQVariant::PenQPen
QVariant::DateTimeQDateTimeQVariant::PixmapQPixmap
QVariant::DoubledoubleQVariant::RectQRect
QVariant::FontQFontQVariant::lmageQlmage
QVariant.:IconQIconQVariant::UserType用户自定义类型

案例分析:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

// 定义学生结构体类型
struct student
{
    int iNo;
    QString strName;
    int score;
};
Q_DECLARE_METATYPE(student)

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
};
#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    // w.show();
    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"

#include <QVariant>
#include <QDebug>
#include <QColor>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QVariant qv1(666);
    qDebug()<<"qv1:"<<qv1.toInt();

    QVariant qv2("zgl nb");
    qDebug()<<"qv2:"<<qv2.toString();

    QMap<QString,QVariant> qmap;
    qDebug()<<endl;
    qmap["int"]=20000; // 整型
    qmap["double"]=99.88; // 浮点型
    qmap["string"]="Good"; // 字符串
    qmap["color"]=QColor(255,255,0); // QColor类型

    // 输出:转换函数来处理
    qDebug()<<qmap["int"]<<qmap["int"].toInt();
    qDebug()<<qmap["double"]<<qmap["double"].toDouble();
    qDebug()<<qmap["string"]<<qmap["string"].toString();
    qDebug()<<qmap["color"]<<qmap["color"].value<QColor>();

    // 创建一个字符串列表:QStringList
    qDebug()<<endl;
    QStringList qsl;
    qsl<<"A"<<"B"<<"C"<<"D"<<"E"<<"F";

    QVariant qvsl(qsl); // 将列表存储在一个QVariant变量
    if(qvsl.type()==QVariant::StringList)
    {
        QStringList qlist=qvsl.toStringList();
        for (int i=0;i<qlist.size();i++) {
            qDebug()<<qlist.at(i);  // 输出列表数据信息
        }
    }

    // 结构体类型和QVariant类配合使用
    qDebug()<<endl;
    student stu;
    stu.iNo=202201;
    stu.strName="sunny";
    stu.score=715;

    // 使用静态方法保存数据
   QVariant qstu=QVariant::fromValue(stu);

    if(qstu.canConvert<student>())  // 判断是否可以转换操作
    {
        student temp=qstu.value<student>(); // 获取数据
        student qtemp=qvariant_cast<student>(qstu); // 获取数据

        qDebug()<<"student:iNo="<<temp.iNo<<",strName="<<temp.strName<<",score="<<temp.score;
        qDebug()<<"student:iNo="<<qtemp.iNo<<",strName="<<qtemp.strName<<",score="<<qtemp.score;
    }




}

MainWindow::~MainWindow()
{
}

编译执行结果:

Q_DECLARE_METATYPE说明

在使用Qt进行应用程序开发时,经常要自定义数据类型,而且在需要的时候还要把这些数据放到QVariant中去。因为QVariant是一个接受绝大部分类型的数据类型。为了达到这个目的,就必须使用Q_DECLARE_METATYPE。

Q_DECLARE_METATYPE是一个宏定义,用于在Qt元对象系统中注册自定义类型。它的作用是将用户定义的类型转换为Qt中的QVariant类型,使其能够用于信号槽的传递和存储。

使用方法是在需要注册的类型前加上Q_DECLARE_METATYPE宏定义,并在应用程序中调用qRegisterMetaType()函数进行注册。

例如,下面是一个自定义的Person类:

class Person {
public:
    QString name;
    int age;
};

为了在Qt中使用该类型,需要添加如下宏定义:

Q_DECLARE_METATYPE(Person)

然后在应用程序中调用qRegisterMetaType()函数进行注册:

qRegisterMetaType<Person>("Person");

这样就能在Qt中使用Person类,并将其作为参数传递到信号槽中。

下面以一段简单的代码说明Q_DECLARE_METATYPE的用法和注意点。

#include <QtGui/QApplication>

#include <QVariant>

struct struct1

{

    int a;

    double b;

};

struct struct2

{

    struct1 s;

    int c;

};


Q_DECLARE_METATYPE(struct1)  //struct1与struct2 谁先谁后,没有影响
Q_DECLARE_METATYPE(struct2)

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    struct1 v1 = {1, 2.0};

    QVariant var1;

    var1.setValue(v1);


    if (var1.canConvert<struct1>())   //判断能否转化为相应类型

    {

        struct1 v11 = var1.value<struct1>();

    }

    struct2 v2 = {{2, 3.0}, 5};

    QVariant var2;

    if (var2.canConvert<struct2>())

    {

        var2.setValue(v2);

        struct2 v22 = var2.value<struct2>();

    }

    return a.exec();

}

通过Q_DECLARE_METATYPE声明后,就可以让自定义的类型设置到QVariant。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

热爱嵌入式的小佳同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值