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。

相关文章
|
6月前
|
存储 安全 编译器
【C++ 多态 】深入理解C++的运行时类型信息(RTTI):dynamic_cast和typeid的应用与原理
【C++ 多态 】深入理解C++的运行时类型信息(RTTI):dynamic_cast和typeid的应用与原理
442 1
|
6月前
|
人工智能 安全 机器人
【C++】dynamic_cast基本用法(详细讲解)
【C++】dynamic_cast基本用法(详细讲解)
|
6月前
|
安全 编译器 C语言
【C++ 类型转换关键字 *_cast 】理解const_cast、reinterpret_cast、dynamic_cast和static_cast的用法
【C++ 类型转换关键字 *_cast 】理解const_cast、reinterpret_cast、dynamic_cast和static_cast的用法
83 0
|
6月前
|
C++
[C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
[C++] 强制类型转换(dynamic_cast和dynamic_Pointer_cast)
110 1
|
Java
定义Student类
定义Student类
135 0
类和对象,display函数不放在Time类中,而作为类外的普通函数,然后分别在Time 和Date类中将display声明为友元函数。
类和对象,display函数不放在Time类中,而作为类外的普通函数,然后分别在Time 和Date类中将display声明为友元函数。