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

【Qt之QVariant】使用

介绍

QVariant类类似于最常见的Qt数据类型的联合。由于C++禁止联合类型包括具有非默认构造函数析构函数的类型,大多数有趣的Qt类不能在联合中使用。如果没有QVariant,则QObject::property()和数据库操作等将会受到影响。

QVariant对象同时持有一个单一类型(T)的单一值(一些类型是多值的,例如字符串列表)。您可以通过convert()将其转换为不同的类型T,使用其中一个toT()函数(例如toSize())获取其值,并使用canConvert()检查该类型是否可以转换为特定类型。

toT()(例如toInt()toString())命名的方法是const的。如果您请求存储的类型,则它们返回存储对象的副本。如果要求使用存储的类型生成的类型,则toT()会复制和转换并保留对象本身不变。如果要求一种无法从存储的类型生成的类型,则结果取决于该类型;有关详细信息,请参见函数文档。

以下是一些示例代码,演示了QVariant的用法:

QDataStream out(...);
QVariant v(123); // variant现在包含一个int
int x = v.toInt(); // x=123
out << v; // 在out中写入类型标记和一个int
v = QVariant("hello");// variant现在包含一个QByteArray
v = QVariant(tr("hello")); // variant现在包含一个QString
int y = v.toInt(); // y=0,因为v不能转换为int
QString s = v.toString(); // s=tr("hello")  (参见QObject::tr())
out << v; // 在out中写入类型标记和一个QString
...
QDataStream in(...); //(打开先前编写的流)
in >> v; //读取int变量
int z = v.toInt(); // z=123
qDebug("Type is %s",v.typeName()); // 打印“Type is int”
v = v.toInt()+100; // variant现在拥有值223
v = QVariant(QStringList());

您甚至可以将QList<QVariant>QMap<QString,QVariant>类型的值存储在variant中,因此您可以轻松构建任意类型的任意复杂度的数据结构。这非常强大和灵活,但可能比在标准数据结构中存储特定类型的方式低效。

QVariant还支持空值的概念,在该概念下,您可以拥有未设置值的定义类型。但是,请注意,只有在设置了值时,QVariant类型才能进行强制转换。

  QVariant x, y(QString()), z(QString(""));x.convert(QVariant::Int);// x.isNull() == true// y.isNull() == true, z.isNull() == false

QVariant可以扩展以支持Type枚举中未提到的其他类型。

关于GUI类型的说明

由于QVariantQt Core模块的一部分,因此它无法向Qt GUI中定义的数据类型(如QColorQImageQPixmap)提供转换函数。换句话说,没有toColor()函数。相反,您可以使用QVariant::value()qvariant_cast()模板函数。例如:

QVariant variant;
...
QColor color = variant.value<QColor>();

所有由QVariant支持的数据类型,包括与GUI相关的类型,都支持反向转换(例如,从QColorQVariant),这是自动的。

QColor color = palette().background().color();
QVariant variant = color;

连续使用canConvert()convert()

当连续使用canConvert()convert()时,canConvert()可能会返回true,但convert()会返回false。这通常是因为canConvert()仅报告了QVariant在给定适当数据的情况下转换类型的一般能力;仍然可能提供实际上无法转换的数据。

例如,当在包含字符串的variant上调用canConvert(Int)时,它将返回true,因为原则上,QVariant能够将数字字符串转换为整数。然而,如果字符串包含非数字字符,则无法将其转换为整数,任何尝试将其转换将失败。因此,两个函数都返回true对于成功的转换来说是很重要的。

成员函数

  1. QVariant:: QVariant() 构造一个无效的变量。
  2. QVariant:: QVariant(Type type) 构造一个空的类型为type的变量。
  3. QVariant:: QVariant(const QRegularExpression &re) 构造一个新的变量,带有正则表达式值re。该函数在Qt 5.0中引入。
  4. QVariant:: QVariant(const QUrl &val) 构造一个新的变量,值为val的url。
  5. QVariant:: QVariant(const QEasingCurve &val) 构造一个新的带有easing curve值val的变量。该函数在Qt 4.7中引入。
  6. QVariant:: QVariant(const QUuid &val) 构造一个值为uuid值val的新变量。该函数在Qt 5.0中引入。
  7. QVariant:: QVariant(const QModelIndex &val) 构造一个新的带有QModelIndex值val的变量。该函数在Qt 5.0中引入。
  8. QVariant:: QVariant(const QPersistentModelIndex &val) 构造一个新的带有QPersistentModelIndex值val的变量。该函数在Qt 5.5中引入。
  9. QVariant:: QVariant(const QJsonValue &val) 构造一个新的带有json值val的变量。该函数在Qt 5.0中引入。
  10. QVariant:: QVariant(const QJsonObject &val) 构造一个新的带有json对象值val的变量。该函数在Qt 5.0中引入。
  11. QVariant:: QVariant(const QJsonArray &val) 构造一个新的带有json数组值val的变量。该函数在Qt 5.0中引入。
  12. QVariant:: QVariant(const QJsonDocument &val) 构造一个新的带有json文档值val的变量。该函数在Qt 5.0中引入。
  13. QVariant:: QVariant(QVariant &&other) 移动构造一个QVariant实例,使其指向other指向的同一对象。该函数在Qt 5.2中引入。
  14. QVariant:: QVariant(int typeId, const void *copy) 构造类型为typeId的变量,并且如果copy不为0则初始化为copy。注意,您必须传递要存储的变量的地址。通常情况下,您不需要使用此构造函数,而是使用. QVariant:: fromValue() 来从由QMetaType::VoidStar和QMetaType::QObjectStar表示的指针类型构造变量。另请参见. QVariant:: fromValue() 和QMetaType::Type。
  15. QVariant:: QVariant(const QVariant &p) 构造一个变量的副本,该变量作为此构造函数的参数传递。
  16. QVariant:: QVariant(QDataStream &s) 从数据流s中读取变量。
  17. QVariant:: QVariant(int val) 构造一个带有整数值val的新变量。
  18. QVariant:: QVariant(uint val) 构造一个带有无符号整数值val的新变量。
  19. QVariant:: QVariant(qlonglong val) 构造一个带有长整型值val的新变量。
  20. QVariant:: QVariant(qulonglong val) 构造一个带有无符号长整型值val的新变量。
  21. QVariant:: QVariant(bool val) 构造一个带有布尔值val的新变量。
  22. QVariant:: QVariant(double val) 构造一个带有浮点值val的新变量。
  23. QVariant:: QVariant(float val) 构造一个带有浮点值val的新变量。该函数在Qt 4.6中引入。
  24. QVariant:: QVariant(const char *val) 构造一个带有val字符串值的新变量。该变量会将val创建为一个QString的深拷贝,并假定输入val的编码为UTF-8。请注意,val被转换为QString以便存储在变量中,. QVariant:: userType() 将为该变量返回QMetaType::QString。可以通过在编译应用程序时定义QT_NO_CAST_FROM_ASCII来禁用该操作符。
  25. QVariant:: QVariant(const QByteArray &val) 构造具有bytearray值val的新变量。
  26. QVariant:: QVariant(const QBitArray &val) 构造具有bitarray值val的新变量。
  27. QVariant:: QVariant(const QString &val) 构造一个具有字符串值val的新变量。
  28. QVariant:: QVariant(QLatin1String val) 构造一个具有字符串值val的新变量。
  29. QVariant:: QVariant(const QStringList &val) 构造一个具有字符串列表值val的新变量。
  30. QVariant:: QVariant(QChar c) 构造一个具有char值c的新变量。
  31. QVariant:: QVariant(const QDate &val) 构造一个具有日期值val的新变量。
  32. QVariant:: QVariant(const QTime &val) 构造一个具有时间值val的新变量。
  33. QVariant:: QVariant(const QDateTime &val) 构造一个具有日期/时间值val的新变量。
  34. QVariant:: QVariant(const QList<QVariant> &val) 构造一个具有列表值val的新变量。
  35. QVariant:: QVariant(const QMap<QString, QVariant> &val) 构造一个具有QVariant映射val的新变量。
  36. QVariant:: QVariant(const QHash<QString, QVariant> &val) 构造一个具有QVariant哈希val的新变量。
  37. QVariant:: QVariant(const QSize &val) 构造一个具有值为val的大小值的新变量。
  38. QVariant:: QVariant(const QSizeF &val) 构造一个具有值为val的大小值的新变量。
  39. QVariant:: QVariant(const QPoint &val) 构造一个具有代表点值val的新变量。
  40. QVariant:: QVariant(const QPointF &val) 构造一个具有代表点值val的新变量。
  41. QVariant:: QVariant(const QLine &val) 构造一个具有表示线值val的新变量。
  42. QVariant:: QVariant(const QLineF &val) 构造一个具有表示线值val的新变量。
  43. QVariant:: QVariant(const QRect &val) 构造一个具有表示矩形值val的新变量。
  44. QVariant:: QVariant(const QRectF &val) 构造一个具有表示矩形值val的新变量。
  45. QVariant:: QVariant(const QLocale &l) 构造一个具有本地值l的新变量。
  46. QVariant:: QVariant(const QRegExp &regExp) 构造一个新的正则表达式值regExp的变量。
  47. QVariant:: ~QVariant() 销毁QVariant和所包含的对象。
    请注意,重新实现清除的子类应重新实现析构函数以调用clear() 。这个析构函数调用clear() ,但因为它是析构函数,所以调用的是QVariant:: clear() ,而不是子类的clear()
  48. bool QVariant::canConvert(int targetTypeId) const:如果变量的类型可以转换为请求的类型targetTypeId,则返回true。在调用toInt()toBool()等方法时,会自动进行此类转换。 以下转换会自动完成:
    bool QVariant::canConvert(int targetTypeId) const
    如果变量的类型可以转换为请求的类型targetTypeId,则返回true。在调用toInt()、toBool()等方法时,会自动进行此类转换。
    以下转换会自动完成:
    在这里插入图片描述

如果QVariant包含指向QObject派生类型的指针,则如果可以进行与targetTypeId所描述的类型相对应的qobject_cast,则此函数也将返回true。请注意,这仅适用于使用Q_OBJECT宏的QObject子类。

如果QVariant包含一个顺序容器,则如果targetTypeId为QVariantList,则该函数也将返回true。可以在不将其提取为(复制的)QVariantList的情况下迭代容器的内容。

QList<int> intList = {7, 11, 42};QVariant variant = QVariant::fromValue(intList);if (variant.canConvert<QVariantList>()) {QSequentialIterable iterable = variant.value<QSequentialIterable>();// Can use foreach:foreach (const QVariant &v, iterable) {qDebug() << v;}// Can use C++11 range-for:for (const QVariant &v : iterable) {qDebug() << v;}// Can use iterators:QSequentialIterable::const_iterator it = iterable.begin();const QSequentialIterable::const_iterator end = iterable.end();for ( ; it != end; ++it) {qDebug() << *it;}}

结果:
在这里插入图片描述
这需要容器的value_type本身是一个元类型。类似地,如果QVariant包含一个顺序容器,则如果targetTypeId为QVariantHash或QVariantMap,则该函数也将返回true。可以在不将其提取为(复制的)QVariantHash或QVariantMap的情况下迭代容器的内容:

  QHash<int, QString> mapping;mapping.insert(7, "Seven");mapping.insert(11, "Eleven");mapping.insert(42, "Forty-two");QVariant variant = QVariant::fromValue(mapping);if (variant.canConvert<QVariantHash>()) {QAssociativeIterable iterable = variant.value<QAssociativeIterable>();// Can use foreach over the values:foreach (const QVariant &v, iterable) {qDebug() << v;}// Can use C++11 range-for over the values:for (const QVariant &v : iterable) {qDebug() << v;}// Can use iterators:QAssociativeIterable::const_iterator it = iterable.begin();const QAssociativeIterable::const_iterator end = iterable.end();for ( ; it != end; ++it) {qDebug() << *it; // The current valueqDebug() << it.key();qDebug() << it.value();}}

结果:
在这里插入图片描述

相关文章:

【Qt之QVariant】使用

介绍 QVariant类类似于最常见的Qt数据类型的联合。由于C禁止联合类型包括具有非默认构造函数或析构函数的类型&#xff0c;大多数有趣的Qt类不能在联合中使用。如果没有QVariant&#xff0c;则QObject::property()和数据库操作等将会受到影响。 QVariant对象同时持有一个单一…...

xv6实验课程--xv6的写时复制fork(2023)

7. xv6实验课程--xv6的写时拷贝(COW)(2021) 7. xv6实验课程--xv6懒惰分页分配&#xff08;lazy)(2020) 本文来源&#xff1a; https://mp.weixin.qq.com/s/XJkhjrlP232ZDsRyXd0oHQ 已完成的实验代码可以从下列网站获取&#xff1a; git clone https://gitee.com/lhwhit196…...

在Windows或Mac上安装并运行LLAMA2

LLAMA2在不同系统上运行的结果 LLAMA2 在windows 上运行的结果 LLAMA2 在Mac上运行的结果 安装Llama2的不同方法 方法一&#xff1a; 编译 llama.cpp 克隆 llama.cpp git clone https://github.com/ggerganov/llama.cpp.git 通过conda 创建或者venv. 下面是通过conda 创建…...

Spring底层原理学习笔记--第七讲--(初始化与销毁)

初始化与销毁 Spring提供了多种初始化和销毁手段它们的执行顺序 A07Application.java package com.lucifer.itheima.a07;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springfram…...

基于斑马算法的无人机航迹规划-附代码

基于斑马算法的无人机航迹规划 文章目录 基于斑马算法的无人机航迹规划1.斑马搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用斑马算法来优化无人机航迹规划。 1.斑马搜索算法 …...

干货 | 接口自动化测试分层设计与实践总结

接口测试三要素&#xff1a; 参数构造 发起请求&#xff0c;获取响应 校验结果 一、原始状态 当我们的用例没有进行分层设计的时候&#xff0c;只能算是一个“苗条式”的脚本。以一个后台创建商品活动的场景为例&#xff0c;大概流程是这样的(默认已经是登录状态下)&#…...

【Linux】服务器与磁盘补充知识,硬raid操作指南

服务器硬件 cpu 主板 内存 硬盘 网卡 电源 raid卡 风扇 远程管理卡 1.硬盘尺寸: 目前生产环境中主流的两种类型硬盘 3.5寸 和2.5寸硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器 但是3.5寸没法转换成2.5寸 2.如何在服务器上制作raid 华为服务器为例子做…...

【java】实现自定义注解校验——方法二

自定义注解校验的实现步骤&#xff1a; 1.创建注解类&#xff0c;编写校验注解&#xff0c;即类似NotEmpty注解 2.编写自定义校验的逻辑实体类&#xff0c;编写具体的校验逻辑。(这个类可以实现ConstraintValidator这个接口&#xff0c;让注解用来校验) 3.开启使用自定义注解进…...

算法通关村第六关|白银|二叉树的层次遍历【持续更新】

1.二叉树基本的层序遍历 仅仅遍历并输出全部元素。 List<Integer> simpleLevelOrder(TreeNode root) {if (root null) {return new ArrayList<Integer>();}List<Integer> res new ArrayList<Integer>();LinkedList<TreeNode> queue new Lin…...

vue中通过js控制scss变量

<!--* Description:* Author: 李大玄* Date: 2022-07-28 20:34:43* FilePath: /web-framework-demo/src/views/layout.vue* LastEditors: 李大玄* LastEditTime: 2022-11-01 09:25:31 --> <template><div height"100%" class"b"><inp…...

深度学习理论知识入门【EM算法、VAE算法、GAN算法】和【RBM算法、MCMC算法、HMC算法】

目录 深度学习理论知识入门首先&#xff0c;让我们了解第一个流程&#xff1a;现在&#xff0c;让我们看看第二个流程&#xff1a; EM算法GMM&#xff08;高斯混合模型&#xff09; 深度学习理论知识入门 首先&#xff0c;让我们了解第一个流程&#xff1a; EM&#xff08;Exp…...

Java8实战-总结47

Java8实战-总结47 CompletableFuture&#xff1a;组合式异步编程让代码免受阻塞之苦使用定制的执行器 对多个异步任务进行流水线操作 CompletableFuture&#xff1a;组合式异步编程 让代码免受阻塞之苦 使用定制的执行器 就这个主题而言&#xff0c;明智的选择似乎是创建一个…...

功能: 在web应用程序中、读取文件

通过使用文件 API&#xff0c;web 内容可以要求用户选择本地文件&#xff0c;然后读取这些文件的内容。这种选择可以通过使用 HTML <input type"file"> 元素或通过拖放来完成。 1.通过 click() 方法使用隐藏的文件 input 元素 你可以隐藏公认难看的文件 <…...

TDD、BDD、ATDD以及SBE的概念和区别

在软件开发或是软件测试中会遇到以下这些词&#xff1a;TDD 、BDD 、ATDD以及SBE&#xff0c;这些词代表什么意思呢&#xff1f; 它们之间有什么关系吗&#xff1f; TDD 、BDD 、ATDD以及SBE的基本概念 TDD&#xff1a;&#xff08;Test Driven Development&#xff09;是一种…...

Android studio:打开应用程序闪退的问题

目录 问题描述分析原因解决方法 在开发Android应用程序的过程中遇到的问题 问题描述 在开发&#xff08;或者叫测试&#xff0c;这么简单的程序可能很难叫开发&#xff09;好一个android之后&#xff0c;在Android studio中调试开发好的app时&#xff0c;编辑器没有提示错误&a…...

Mysql数据库性能优化--performance_SCHEMA.STATEMENTS语句分析

使用performance_schema解决常见的故障案例 1 检查sql语句 使用performance_schema很容易找到引起性能问题的查询以及原因。 要启动语句检测&#xff0c;需要启动statement类型的插装。 插装类&#xff1a; statement/sql sql语句&#xff0c;如select,或者create table。s…...

[C/C++]数据结构 链表OJ题: 反转链表

描述: 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 示例: 方法一: 让链表指向反向 如图所示: 代码思路: struct ListNode* reverseList(struct ListNode* head) {struct ListNode* n1NULL;struct ListNode* n2head;struct ListNode*…...

深度学习之基于YoloV5交通信号标志识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于YoloV5交通信号标志识别系统介绍 基于YoloV5的交通信号标志识别系统是一种深度学习应用&#xff0c;旨在通过使…...

Linux命令大全

荒诞也好&#xff0c;愚笨也好&#xff0c;总会过去的 文章目录 文件相关压缩相关tarzip 进程相关pskill 网络相关netstat IPC相关ipcsipcrm 系统资源相关topfreefdiskdfdu 权限相关umaskchmodchownchgrp 总结 文件相关 ls&#xff1a;列出当前目录中的文件和子目录。 ls常用…...

元宇宙是否为噱头?若不是,什么是元宇宙?他的概念、技术、应用和影响是什么?

文章来源&#xff1a;元宇宙的概念、技术、应用与影响——一项系统性文献综述 - 中国知网 (cnki.net) 摘要 [目的/意义]系统综述与分析当前国内外的元宇宙研究现状&#xff0c;有利于准确把握元宇宙发展方向&#xff0c;强化元宇宙基础研究&#xff0c;争取元宇宙建构权。[方法…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...