QVariant的使用

2023-11-07

一、介绍

QT的官方文档这么写的:The QVariant class acts like a union for the most common Qt data types。QVariant可以存储各种数据类型,QVariant行为类似于C/C++的union, 但在Qt中比union强大很多。

QVariant内置支持所有QMetaType::Type里声明的类如:int,QString,QFont,QColor等,甚至QList,QMap<QString, QVariant>等组成的任意复杂类型。

当然,如果支持的类型没有想要的,没关系,QVariant也可以支持自定义的数据类型。被QVariant存储的数据类型需要有一个默认的构造函数和一个拷贝构造函数。为了实现这个功能,首先必须使用Q_DECLARE_METATYPE()宏。通常会将这个宏放在类的声明所在头文件的下面:

Q_DECLARE_METATYPE(MyClass)
 

二、使用

普通变量

    QVariant var1;
    var1.setValue(12);
    int data1 = var1.toInt();

    qDebug() << data1;

    QVariant var2 = 14;
    int data2 = var2.toInt();
    qDebug() << data2;

打印

 

结构体

#include <QtCore/QCoreApplication>
#include <QString>
#include <QtDebug>
#include <QVariant>

struct MyClass {
    int id;
    QString name;
};
Q_DECLARE_METATYPE(MyClass)
    
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    MyClass myClass;
    myClass.id = 0;
    myClass.name = QString("LiMing");

    QVariant var3;
    var3.setValue(myClass); //设置QVariant的值
    qDebug() << "var3:" << var3;

    MyClass stu; //这部分代码主要是将QVariant类再转化为MyClass类,其他QVariant类转化成其他类也可用这种方法
    stu = var3.value<MyClass>();
    qDebug() << "stu:" << stu.id << stu.name;

    return a.exec();
} 

 

保存指针

    //保存
    QVariant var = QVariant::fromValue((void*)event);
    
    //获取
    QPaintEvent* pointer = (QPaintEvent*)var.value<void*>();

三、源码

打开QVariant的定义,我们看到它使用了C++的联合

    struct Private
    {
        union Data
        {
            char c;
            uchar uc;
            short s;
            signed char sc;
            ushort us;
            int i;
            uint u;
            long l;
            ulong ul;
            bool b;
            double d;
            float f;
            qreal real;
            qlonglong ll;
            qulonglong ull;
            QObject *o;
            void *ptr;
            PrivateShared *shared;
        } data;
        uint type : 30;
        uint is_shared : 1;
        uint is_null : 1;
    };

支持的类型

    enum Type {
        Invalid = QMetaType::UnknownType,
        Bool = QMetaType::Bool,
        Int = QMetaType::Int,
        UInt = QMetaType::UInt,
        LongLong = QMetaType::LongLong,
        ULongLong = QMetaType::ULongLong,
        Double = QMetaType::Double,
        Char = QMetaType::QChar,
        Map = QMetaType::QVariantMap,
        List = QMetaType::QVariantList,
        String = QMetaType::QString,
        StringList = QMetaType::QStringList,
        ByteArray = QMetaType::QByteArray,
        BitArray = QMetaType::QBitArray,
        Date = QMetaType::QDate,
        Time = QMetaType::QTime,
        DateTime = QMetaType::QDateTime,
        Url = QMetaType::QUrl,
        Locale = QMetaType::QLocale,
        Rect = QMetaType::QRect,
        RectF = QMetaType::QRectF,
        Size = QMetaType::QSize,
        SizeF = QMetaType::QSizeF,
        Line = QMetaType::QLine,
        LineF = QMetaType::QLineF,
        Point = QMetaType::QPoint,
        PointF = QMetaType::QPointF,
        RegExp = QMetaType::QRegExp,
        RegularExpression = QMetaType::QRegularExpression,
        Hash = QMetaType::QVariantHash,
        EasingCurve = QMetaType::QEasingCurve,
        Uuid = QMetaType::QUuid,
        ModelIndex = QMetaType::QModelIndex,
        PersistentModelIndex = QMetaType::QPersistentModelIndex,
        LastCoreType = QMetaType::LastCoreType,

        Font = QMetaType::QFont,
        Pixmap = QMetaType::QPixmap,
        Brush = QMetaType::QBrush,
        Color = QMetaType::QColor,
        Palette = QMetaType::QPalette,
        Image = QMetaType::QImage,
        Polygon = QMetaType::QPolygon,
        Region = QMetaType::QRegion,
        Bitmap = QMetaType::QBitmap,
        Cursor = QMetaType::QCursor,
        KeySequence = QMetaType::QKeySequence,
        Pen = QMetaType::QPen,
        TextLength = QMetaType::QTextLength,
        TextFormat = QMetaType::QTextFormat,
        Matrix = QMetaType::QMatrix,
        Transform = QMetaType::QTransform,
        Matrix4x4 = QMetaType::QMatrix4x4,
        Vector2D = QMetaType::QVector2D,
        Vector3D = QMetaType::QVector3D,
        Vector4D = QMetaType::QVector4D,
        Quaternion = QMetaType::QQuaternion,
        PolygonF = QMetaType::QPolygonF,
        Icon = QMetaType::QIcon,
        LastGuiType = QMetaType::LastGuiType,

        SizePolicy = QMetaType::QSizePolicy,

        UserType = QMetaType::User,
        LastType = 0xffffffff // need this so that gcc >= 3.4 allocates 32 bits for Type
    };

 构造函数

 

参考:

Qt之QVariant用法_蜗牛lx的博客-CSDN博客_qvariant

QVariant的用法_十年之少的博客-CSDN博客_qvariant

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QVariant的使用 的相关文章

  • QMessageBox::about 可以根据标题长度调整大小吗?

    我想创建一个简单的 关于 对话框 但注意到QMessageBox about不会根据标题的长度调整其大小 由于字体较大 标题通常会更长 至少在我的桌面环境中 仅根据内容调整其大小 有没有办法确保对话框足够大以显示所有标题 我当然可以向 ab
  • 在Qt中,如何正确实现委托?

    我遵循模型 视图 控制器范例 我很确定模型和视图是正确的 但我认为我的代表做错了一些事情 一切都 有效 除了第一次单击控件只是 点亮控件 而第二次单击与之交互之外 这是代表通常的实施方式吗 我的实现需要大量的构造和销毁 由scoped pt
  • 在 Windows 上从源代码构建 PhantomJS-2

    我正在尝试基于这些在 Windows 8 1 x64 上从源代码构建 PhantomJS 2 的开发版本指示 https github com ariya phantomjs wiki PhantomJS 2 但是我收到以下错误 mingw
  • 如何使用 qt 库中的调试符号为 qt 5.5 创建开发 shell

    我有一个开发外壳buildInputs条目包括qt55 qtbase 这很好用 今天 我在 qt 库中发生了段错误 我想要带有调试符号的 qt 库 我看了一下nixpkgs pkgs development libraries qt 5 5
  • 无法将 [未定义] 分配给 QColor

    我正在使用 Qt 5 11 构建 运行代码 代码中有QML风格如下 Button style delegate Component id enabledButtonStyle ButtonStyle padding top 0 paddin
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • 在另一个中使用 QAbstractListModel

    我在尝试使用 Qt QML 为我的应用程序开发数据模型时遇到问题 我已经用过一个QAbstractListModel能够将海关数据模型从 C 传递到 QML 并且它对于简单模型 例如基于字符串和布尔的模型 来说就像一个魅力 但现在我需要建立
  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • PySide6.1 与 matplotlib 3.4 不兼容

    当我只安装PySide6时 GUI程序运行良好 但是一旦我安装了matplotlib及其依赖包 包括pyqt5 则GUI程序将无法运行并输出以下错误消息 This application failed to start because no
  • 更改 Qt 中的语言环境

    我尝试使用 QLocale 和 setDefault 函数更改区域设置 但似乎不起作用 以下是使用 C 本地化库和 QLocale 更改语言环境的示例 对于 C 本地化库 它似乎可以工作 但对于 QLocale setDefault 函数调
  • Qt 码头调整大小事件

    有没有办法在 Qt 中捕捉码头的调整大小事件 我需要能够检测到扩展坞何时调整大小 而不仅仅是其位置或 功能 发生变化时 看起来 QDockWidget 没有 调整大小 信号 如果您不希望子类化以仅获得调整大小事件控件 您可以安装事件过滤器
  • 如何使用样式表删除 QWizard 中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我已经发布了一个最小的例子here https stackoverflow com q 52538669 8570451 这个问题是由scopchanov从最小的例子中解决的 但是
  • QGraphicsView 在完整布局中未最大化

    I have following GUI having four QGraphicView objects 正如您在每个视图下看到的那样 它有四个工具按钮 为了最大化视图 我连接了工具按钮的信号来隐藏其他三个视图的插槽 并将大小策略设置为扩
  • Qt:关闭模式对话框关闭程序

    在我的 Qt 程序中 我有 2 个窗口 主窗口和子窗口 在程序中 一次仅显示这些窗口之一 主窗口有一个插槽 用于创建模式对话框 现在 假设子窗口中单击按钮的信号被发送到该插槽 在这种情况下 主窗口隐藏 子窗口可见 对话框显示得很好 但是当对
  • 如何从 ffmpeg 中打开的文件获取流信息?

    我正在尝试使用 ffmpeg 读取视频文件 我有与其旧版本相对应的工作代码 并开始尝试升级到最新的构建版本 将所有这些已弃用的函数替换为其实际的类似函数 但是我遇到了问题 似乎没有检索到任何流 并且视频负载停止在轨道中 这是我正在使用的代码
  • QListWidget 拖放项目从 Symbian 列表中消失

    我在实现带有可通过拖放重新排序的自定义项的 QListWidget 时遇到问题 问题是当我在某个项目上快速双击 非常短的拖放 时 该项目有时会从 QListWidget 中消失 这是我的小部件的构造函数 ListPopisiDragDrop
  • QTableView 选择已更改

    我有一个QTableView我需要从中获取选择更改事件 我似乎无法让连接工作 我有 MyWidget h protected slots void slotLoadTransaction const QItemSelection selec
  • 使用 QSet 作为 Qt 地图容器中的键

    我需要一个映射 其中键是唯一的 并且每个键都是一组或自定义 POD 结构 其中包含 3 个数据项 这些值只是指向对象实例的指针 从阅读Qt 的 QMap 与 QHash 的文档 http qt project org doc qt 4 8
  • 通过CMake实现Qt项目

    我正在尝试通过 Cmake 构建并运行非常简单且基本的 Qt 示例 删除 pro 文件 以下是Qt项目的代码 自动生成的Qt项目的目录结构为 Cmake my project name headers mainwindow h source
  • 如何在Qt无框窗口中实现QSizeGrip?

    如何使用 Qt 无框窗口实现 QSizeGrip 代码会是什么样的 您只需在布局内窗口的一角添加 QSizeGrip 即可使其保持在该角落 QDialog dialog new QDialog 0 Qt FramelessWindowHin

随机推荐

  • MySQL的分片(一)——分布式数据库概述

    系统分析 OLAP or OLTP 在互联网时代 海量数据的存储与访问成为系统设计与使用的瓶颈问题 对于海量数据处理 按照使用场景 主要分为两种类型 联机事务处理 OLTP 和联机分析处理 OLAP 联机事务处理 OLTP 也称为面向交易的
  • Typora+PicGo+GitHub搭建免费图床

    准备工作 Typora官网 PicGo官网 PicGo Core配置文件 Github 或Gitee Github准备图床仓库 新建一个仓库 仓库一定要设置为public公共仓库 生成私人令牌 Github主页右上角点击用户头像 gt Se
  • 课程2:《黑马程序员_Java基础视频-深入浅出精华版》-视频列表-

    day01 avi 01 01 计算机基础 计算机概述 avi day01 avi 01 02 计算机基础 计算机硬件和软件概述 avi day01 avi 01 03 计算机基础 软件开发和计算机语言概述 avi day01 avi 01
  • 用数学思想演绎的一些系统概念

    在这一部分要给出系统的数学定义 因为公式编辑器有时候不太好用 所以尽量简化 系统的定义 增长 竞争 整体 和 机械化 中心化 最终形态 最终形态的类型 学科中的同构 学科的联合 1 系统的定义 系统的数学定义如下 系统是由元素 元素之间相互
  • ip route 路由命令详解

    523条消息 ip route 命令详解 thj blog的博客 CSDN博客 ip route命令详解 Linux如何查看网关地址 study goup 博客园 cnblogs com 添加路由192 20 30 0 24网段走eth0网
  • python接口自动化测试视频教程百度云全集_python自动化运维测试框架实战视频教程百度云资源...

    python自动化运维测试框架实战视频教程百度云资源 web app 接口自动化 自动化框架 课程目录 开学典礼 上 开学典礼 下 python基础 Python入门 预习视频 python基础 对象与变量 预习视频 python基础 字符
  • Visio里Mathtype公式变形问题解决

    直接从word或者ppt复制MathType公式到Visio里可能会发生公式的变形 查找了一下解决办法 记录一下 建议不要只要从其他office软件直接复制过来 第一步 找到Visio工具栏的插入 然后选择对象 双击插入就可以了 后面的其他
  • QT5背景图片不显示的问题解决方法

    将qt creator左栏的项目 gt 概要 gt shadow build里的勾去除 使生成的debug文件放在源代码目录下 问题就解决了 更多绿色版本软件及机器视觉学习资料 请关注关注公众号 机器视觉智能解决方案
  • 5. 模块化编程

    HI 大家好 我是茶桁 上一节中我们学习了Python基本的流程控制 并且预告了这一节的内容 就是将要学习 模块化编程 那什么是模块化编程呢 按照维基百科的说法 模块化编程 英语 modular programming 是强调将计算机程序的
  • 军品研制过程介绍

    对于新入军品这个行业的新人来说 很难找到一个标准 或者程序等 将整个军品研制过程描述展示出来 本文章将系统性的讲述整个研制过程 一 军品研制过程 军品研制过程分为以下几个过程 可参照GJB 3273 论证阶段 L 技术性能指标可行性论证 方
  • C++访问限定符private、public、protected的使用场景

    众所周知 C 中有3种访问符 分别是private public protected 其中private和public比较好理解 private 只能由该类中的函数 其友元函数访问 不能被任何其他访问 更不能由该类的对象在类外进行访问 类成
  • 软件连接设置_丰田Techstream软件初探(刷一键升窗)

    前面通过我介绍 丰田Mini vci J2534检测线在64位系统安装 不少同学已经购买了J2534数据线 并在64位系统下安装成功了 如安装不成功 可以通过公众号的文字输入栏 发文字给我 我尽量及时解答 今天给大家聊聊如何使用丰田Tech
  • 功能测试基础之界面测试

    功能测试基础之界面测试 文章目录 功能测试基础之界面测试 前言 一 易用性 简述 易用性细则 二 规范性 简述 规范性细则 三 合理性 简述 合理性细则 四 美观与协调性 简述 美观与协调性细则 五 菜单位置 简述 菜单测试细则 六 独特性
  • JSP页面UTF-8格式中文字符串乱码问题解决方法

    JSP页面使用utf8格式保存中文字符串到文件或进行socket传送接收数据时 常常会出现乱码 这里给出了一个解决方法 实践检验行之有效 0 页面属性设置
  • 在linux shell中使用ftp命令来实现自动登陆、上传与下载

    前段时间有个需求 需要利用crontab定时往某个FTP上传文件 原以为linux中带的ftp命令只支持交互式的操作 没法在命令行下使用 所以后来打算利用PHP中提供的ftp命令来做 但是很不幸的发现ftp模块不是PHP的标准模块 还需要自
  • 到底什么是“容器适配器”?

    首先 我们要明白适配器是干什么的 其实就是一个接口转换装置 是得我们能用特定的方法去操作一些我们本来无法操作的东西 举一个例子 比如你的一个设备支持串口线 而你的电脑支持的是usb口 这时候 我们没有必要重新买一个支持usb的设备 只需要一
  • 2020“闭关”跳槽季,啃透分布式三大技术:限流、缓存、通讯

    01 分布式限流 1 1 Nginx ZooKeeper面试常备题 附答案 请解释一下什么是 Nginx 请列举 x Nginx 的一些特性 请列举 x Nginx 和 和 Apache 之间的不同点 请解释 x Nginx 如何处理 P
  • el-input获取输入框光标位置

    今天接到需求 输入框在正常输入的同时 可以通过点击其他按钮在输入框光标位置添加内容 那么这时候就需要去获取输入框的光标内容 由于在点击其他按钮时 输入框会自动触发失焦事件 因此在blur的时候去触发方法即可
  • Linux-安装MySQL(详细教程)

    Linux 安装MySQL 前言 一 概述 二 下载 三 安装 四 卸载 五 常用设置 六 可能遇到的问题 前言 本文的主要内容是在 Linux 上安装 MySQL 以下内容是源于 B站 MySQL数据库入门到精通 整理而来 一 概述 My
  • QVariant的使用

    一 介绍 QT的官方文档这么写的 The QVariant class acts like a union for the most common Qt data types QVariant可以存储各种数据类型 QVariant行为类似于