当前位置: 首页 > article >正文

「QT」基础数据类 之 QVariant 通用数据类

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「QT」QT5程序设计
📚全部专栏
「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合
「C/C++」C/C++程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制开发
「Py」Python程序设计「Math」探秘数学世界「PK」Parasolid函数说明

目录

    • Qt中QVariant类详解(基于Qt 5.15版本)
      • 一、引言
      • 二、使用范围
      • 三、类的头文件
      • 四、类的继承
      • 五、类的构造介绍
      • 六、公有函数介绍
      • 七、Static函数介绍
      • 八、运算符重载
      • 九、详细代码举例

Qt中QVariant类详解(基于Qt 5.15版本)

一、引言

QVariant是Qt框架中一个功能强大的变体类,提供了一种通用的方式来存储Qt对象及其他类的值。它类似于C++17的std::variant或者C++中的boost::any类型,能够存储几乎所有数据类型,包括基本数据类型(如整数、浮点数、布尔值等)、字符串、日期和时间、颜色等,以及Qt的各种对象类型和自定义数据类型。QVariant类在Qt的模型/视图架构、信号和槽机制以及多线程应用程序的开发中扮演着重要角色。
官方帮助:https://doc.qt.io/qt-5/qvariant.html

二、使用范围

QVariant在Qt中的应用非常广泛,主要用于在Qt的各种组件之间存储和传递多种类型的数据。它支持基本数据类型、Qt容器类型(如QList、QMap等)以及自定义类型。QVariant可以作为中间转换类,进行不同数据类型或者Qt容器类之间的类型转换,使得Qt开发者能够编写更通用、更灵活的代码。

三、类的头文件

QVariant类的头文件是<QVariant>,它属于Qt的Core模块。使用QVariant时,需要在项目的.pro文件中添加QT += core

四、类的继承

QVariant类没有直接的父类,它是Qt框架中一个独立的类。QVariant的行为类似于C/C++的union,但在Qt中比union强大很多,因为它内置支持所有QMetaType::Type里声明的类型,如int、QString、QFont、QColor等,甚至QList、QMap等组成的任意复杂类型。

五、类的构造介绍

QVariant类提供了多种构造函数,可以通过直接赋值来存储数据。例如:

  • QVariant var1(123); // 存储一个整数
  • QVariant var2("hello"); // 存储一个字符串
  • QVariant var3(QDate::currentDate()); // 存储一个QDate对象

此外,QVariant还提供了QVariant()构造函数,用于创建一个无效的QVariant对象。

六、公有函数介绍

QVariant类提供了丰富的公有函数,用于存储、转换和检查数据类型。以下是一些常用的公有函数:

  • bool isValid() const; // 返回QVariant是否包含有效数据
  • Type type() const; // 返回QVariant的类型枚举值
  • QString typeName() const; // 返回QVariant的类型名称字符串
  • void clear(); // 清除QVariant中的数据,将其设为无效
  • bool canConvert(Type targetType) const; // 检查QVariant是否可以转换为指定的类型
  • bool convert(Type targetType) const; // 将QVariant转换为指定类型
  • T value() const; // 返回QVariant的值,模板函数,根据实际类型传递类型参数

此外,QVariant还提供了大量的转换函数,如toInt()toString()toDate()等,用于将QVariant对象中的数据转换为其他数据类型。

七、Static函数介绍

QVariant类还提供了一些静态函数,用于处理自定义类型和进行类型转换。以下是一些常用的静态函数:

  • template<typename T> static inline QVariant fromValue(const T &value); // 用于将自定义类型转换为QVariant对象
  • template<typename T> static bool registerMetaType(); // 用于注册自定义类型到MetaType系统中(注意:在Qt 5.x中,通常使用qRegisterMetaType<T>()函数来注册自定义类型)

八、运算符重载

QVariant类没有提供运算符重载功能。但是,它提供了丰富的转换函数和类型检查函数,使得开发者可以在需要时进行数据类型转换和检查。

九、详细代码举例

以下是一个使用QVariant类的详细代码示例,展示了如何存储、转换和检查数据类型:

#include <QCoreApplication>
#include <QVariant>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 存储数据
    QVariant var1(123);
    QVariant var2("hello");
    QVariant var3(QDate::currentDate());

    // 转换数据类型
    int intValue = var1.toInt();
    QString strValue = var2.toString();
    QDate dateValue = var3.toDate();

    qDebug() << "Integer value:" << intValue;
    qDebug() << "String value:" << strValue;
    qDebug() << "Date value:" << dateValue.toString();

    // 判断数据类型
    if (var1.type() == QVariant::Int) {
        qDebug() << "var1 is of type Int";
    }

    // 检查是否可以转换类型
    bool canConvertToString = var1.canConvert<QString>();
    qDebug() << "Can var1 be converted to QString?" << canConvertToString;

    // 存储自定义类型
    struct MyData {
        int value;
    };
    Q_DECLARE_METATYPE(MyData);
    qRegisterMetaType<MyData>("MyData");

    MyData myData = {123};
    QVariant var4;
    var4.setValue(myData);
    MyData retrievedData = var4.value<MyData>();
    qDebug() << "Retrieved MyData value:" << retrievedData.value;

    return a.exec();
}

在这个示例中,我们展示了如何使用QVariant类存储整数、字符串和日期数据,如何进行数据类型转换和检查,以及如何存储和检索自定义类型数据。


在这里插入图片描述


http://www.kler.cn/a/391378.html

相关文章:

  • 【RAG实战】Prompting vs. RAG vs. Finetuning: 如何选择LLM应用选择最佳方案
  • 数据流图和流程图的区别
  • 脑肿瘤检测数据集,对9900张原始图片进行YOLO,COCO,VOC格式的标注
  • ElasticPDF-新国产 PDF 编辑器开发框架(基于 pdf.js Web PDF批注开发,实现高亮多边形橡皮擦历史记录保存注释文字)
  • 如何利用Python爬虫获得1688按关键字搜索商品
  • set的使用
  • PHY6235超低功耗蓝牙和专有2.4G应用的SOC芯片内置MCU
  • Git 中的 patch 功能
  • 生成式模型的热点新闻和进展
  • 第8章利用CSS制作导航菜单
  • 鸿蒙ZRouter动态路由框架—生命周期管理能力
  • 论云游戏的性能与性价比,ToDesk、青椒云、顺网云游戏等具体实操看这篇就够了
  • SAP ABAP开发学习——function alv复选框设置
  • [论文阅读]Enhanced Membership Inference Attacks against Machine Learning Models
  • jmeter基础05_第1个http请求
  • Java基于SpringBoot+Vue的宠物共享平台的设计与实现(附源码,文档)
  • 22. 记录架构
  • 【热门主题】000041 网络安全:守护数字世界的坚固防线
  • Javascript笔记(一):闭包函数
  • 状态空间方程离散化(Matlab符号函数)卡尔曼
  • 看不见的力量——超声技术在工业中的应用
  • Spring Boot编程训练系统:深入设计与实现
  • [Codesys]常用功能块应用分享-BMOV功能块功能介绍及其使用实例说明
  • P-tuning、Prompt-tuning和Prefix-tuning区别是什么?
  • Java 实现自定义 LRU 缓存
  • 【Effective C++】阅读笔记6