QVariant类应用 和 Q_DECLARE_METATYPE说明

简介: QVariant类应用 和 Q_DECLARE_METATYPE说明

QVariant

        QVariant 类本质为 C++联合(Union)数据类型,它可以保存很多Qt 类型的值,包括 QBrush、QColor、QString 等等。也能够存放Qt 的容器类型的值。

       QVariant::StringList 是 Qt 定义的一个 QVariant::type 枚举类型的变量,其他常用的枚举类型变量如下表所示:

             变量    对应的类型                变量     对应的类型
QVariant::Invalid 无效类型 QVariant::Time QTime
QVariant::Region QRegion QVariant::Line QLine
QVariant::Bitmap QBitmap QVariant::Palette QPalette
QVariant::Bool bool QVariant::List QList
QVariant::Brush QBrush QVariant::SizePolicy QSizePolicy
QVariant::Size QSize QVariant::String QString
QVariant::Char QChar QVariant::Map QMap
QVariant::Color QColor QVariant::StringList QStringList
QVariant::Cursor QCursor QVariant::Point QPoint
QVariant::Date QDate QVariant::Pen QPen
QVariant::DateTime QDateTime QVariant::Pixmap QPixmap
QVariant::Double double QVariant::Rect QRect
QVariant::Font QFont QVariant::lmage Qlmage
QVariant.:Icon QIcon QVariant::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。

相关文章
|
存储 编译器 C++
QT之QFlags详解
QT之QFlags详解
460 0
|
存储 C++ 容器
(3)Qt中的变体数据类型(QVariant)
QVariant是Qt中一个强大的变体数据类型,能够存储和管理多种Qt和C++基本数据类型,包括自定义类型,并通过setValue()和value()方法进行赋值和取值。
774 9
(3)Qt中的变体数据类型(QVariant)
|
监控 数据可视化 Linux
Qt Model&View&Delegate(模型-视图-代理) 介绍和使用
Qt Model&View&Delegate(模型-视图-代理) 介绍和使用
Qt Model&View&Delegate(模型-视图-代理) 介绍和使用
|
数据安全/隐私保护
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Line Edit的使用及说明
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Line Edit的使用及说明
1866 0
【Qt 学习笔记】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout
【Qt 学习笔记】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout
964 2
|
XML JSON 前端开发
Qt委托代理机制之《Model/View/Delegate使用方法》
Qt委托代理机制之《Model/View/Delegate使用方法》
990 1
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Combo Box的使用及说明
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Combo Box的使用及说明
1425 0
|
Linux 图形学
深入理解Qt定时器:QTimer的魅力与挑战(一)
深入理解Qt定时器:QTimer的魅力与挑战
7928 0
|
XML 数据可视化 程序员
Qt 中的项目文件解析和命名规范
Qt 中的项目文件解析和命名规范
|
存储 数据可视化 NoSQL
Qt Creator的CDB调试器--使用技巧与解决调试很慢的心得,重点是Symbols Path设置
Qt Creator的CDB调试器--使用技巧与解决调试很慢的心得,重点是Symbols Path设置
3576 0
Qt Creator的CDB调试器--使用技巧与解决调试很慢的心得,重点是Symbols Path设置