Qt扫盲-QVariant理论使用总结

Qt扫盲-QVariant理论使用总结

  • 一、概述
  • 二、使用用例
  • 三、关于GUI类型的说明
  • 四、连续使用canConvert()和convert()

一、概述

QVariant 是一个用来存放变体数据的工具类,因为c++禁止 union 包含具有非默认构造函数或析构函数的类型,所以大多数有趣的Qt类不能在Union中使用。如果没有QVariant,这对于QObject::property()和 数据库工作 等来说将是一个问题。

QVariant对象一次只保存一种 type() 的一个值。(有些 type()是多值的,例如字符串列表。)我们可以找出变量T的类型,使用 convert() 将其转换为不同的类型,使用toT()函数(例如toSize())获取其值,并使用 canConvert() 检查该类型是否可以转换为特定类型。为了安全起见,都是建议先看看能不能转换再转换。

二、使用用例

QVariant 提供了很多名为 toT() 的方法 (例如toInt()、toString())是const。如果询问存储的类型,它们会返回存储对象的副本。如果指定的类型可以根据存储的类型生成,toT()会进行复制和转换,而不会改变对象本身。

下面是一些示例代码来演示QVariant的使用:

  QDataStream out(...);QVariant v(123);                // The variant now contains an intint x = v.toInt();              // x = 123out << v;                       // Writes a type tag and an int to outv = QVariant("hello");          // The variant now contains a QByteArrayv = QVariant(tr("hello"));      // The variant now contains a QStringint y = v.toInt();              // y = 0 since v cannot be converted to an intQString s = v.toString();       // s = tr("hello")  (see QObject::tr())out << v;                       // Writes a type tag and a QString to out...QDataStream in(...);            // (opening the previously written stream)in >> v;                        // Reads an Int variantint z = v.toInt();              // z = 123qDebug("Type is %s",            // prints "Type is int"v.typeName());v = v.toInt() + 100;            // The variant now hold the value 223v = QVariant(QStringList());

我们甚至可以将 QList<QVariant> 和 QMap<QString, QVariant> 的值存储在一个 QVariant 中,这样我们就可以轻松地构造任意类型的任意复杂的数据结构。这是非常强大和通用的,但与在标准数据结构中存储特定类型相比,这种转换是被证明内存和速度效率更低。

QVariant还支持null值的概念,我们可以定义一个没有值的类型。但是请注意,QVariant类型只有在设置了值时才能强制转换。

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

QVariant可以被扩展以支持enum类型之外的其他类型。详见创建自定义Qt类型。

三、关于GUI类型的说明

因为QVariant是 Qt Core 模块的一部分,它不能提供到Qt GUI中定义的数据类型(如QColor、QImage和QPixmap)的转换函数。换句话说,没有toColor()函数。相反,我们可以使用 QVariant::value() 或 qvariant_cast() 模板函数。例如:

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

提供了这个功能的话很多类型就可以转换的。这个就很强大的。

对于QVariant支持的所有数据类型,包括gui相关类型,都会自动进行逆转换(例如,从QColor到QVariant):

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

四、连续使用canConvert()和convert()

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

例如,当调用包含字符串的变量时,canConvert(Int)将返回true,因为原则上,QVariant能够将数字字符串转换为整数。但是,如果字符串中包含非数字字符,则不能将其转换为整数,而且转换将失败。

因此,要成功转换,两个函数都返回true很重要。

因为准换的时候也得考虑能不转成功,canConvert() 只指示能转,也就是QVarent 支持转的功能,但是 convert() 指示是否已经转换成功的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/87252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PCIE702-1】基于Kintex UltraScale系列FPGA的高性能PCIe总线数据预处理载板

PCIE702-1是一款基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡采用Xilinx的高性能Kintex UltraScale系列FPGA作为实时处理器&#xff0c;实现各个接口之间的互联。板卡具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1路PCIe x8主机接口&#xff0c;板载…

AxureRP制作静态站点发布互联网,实现公网访问【内网穿透】

AxureRP制作静态站点发布互联网&#xff0c;内网穿透实现公网访问 文章目录 AxureRP制作静态站点发布互联网&#xff0c;内网穿透实现公网访问前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4…

【实战项目之个人博客】

目录 项目背景 项目技术栈 项目介绍 项目亮点 项目启动 1.创建SSM&#xff08;省略&#xff09; 2.配置项目信息 3.将前端页面加入到项目中 4.初始化数据库 5.创建标准分层的目录 6.创建和编写项目中的公共代码以及常用配置 7.创建和编写业务的Entity、Mapper、…

认识HTTP和HTTPS协议

HTTPS 是什么 HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. 为什么要引入加密层呢&#xff1f; HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现一些被篡改的情况. HTTPS就是在HTTP的基础上进行了加密&#xff0c;进一步的保…

Qt QCustomPlot介绍

介绍 主要介绍qcustomplot及其用法 最新版本:QCustomPlot Patch Release 2.1.1//November 6, 2022 下载:https://www.qcustomplot.com/index.php/download 官网:https://www.qcustomplot.com/index.php 简单使用 mainwindow.h /**************************************…

云防火墙和传统防火墙区别是什么

云防火墙和传统防火墙的区别是什么呢&#xff1f;在当前的网络环境中&#xff0c;网络安全问题日益复杂且频发&#xff0c;企业和个人都需要在保护网络的同时确保数据的安全性。为此&#xff0c;防火墙作为一种重要的网络安全设备&#xff0c;发挥着关键的作用。然而&#xff0…

2023年8月京东洗烘套装行业品牌销售排行榜(京东数据开放平台)

鲸参谋监测的京东平台8月份洗烘套装市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年8月份&#xff0c;京东平台洗烘套装的销量为1.1万&#xff0c;同比增长约218%&#xff1b;销售额约为1.2亿&#xff0c;同比增长约279%。可以看到&#xff0c;洗烘…

清华用7个ChatGPT模拟《狼人杀》,结果出乎意料!

为了验证大语言模型的沟通、规划、反思等拟人化能力&#xff0c;清华研究团队发布了一篇名为“探索大语言模型在交流游戏中的应用&#xff1a;《狼人杀》实验”的研究论文。 结果显示&#xff0c;通过ChatGPT&#xff08;GPT -turbo-0301&#xff09;构建的7个玩家&#xff0c…

HEC-RAS 1D/2D水动力与水环境模拟从小白到精通

专题一 水动力模型基础 1.水动力模型的本质 2.水动力模型的基本方程与适用范围 3.模型建模要点 4.注意事项与建模经验 专题二 恒定流模型(1D/2D) 1.恒定流及其适用范围 2.水面线分析及其数据要求 3.曼宁公式与恒定流&#xff0c;后处理 4.HEC-RA的水工建筑物&#xff…

【计算机网络】IP协议第二讲(Mac帧、IP地址、碰撞检测、ARP协议介绍)

IP协议第二讲 1.IP和Mac帧2.碰撞检测2.1介绍2.2如何减少碰撞发生2.3MTU2.4一些补充 3.ARP协议3.1协议介绍3.2报文格式分析 1.IP和Mac帧 IP&#xff08;Internet Protocol&#xff09;和MAC&#xff08;Media Access Control&#xff09;帧是计算机网络中两个不同层次的概念&am…

Swift SwiftUI 隐藏键盘

如果仅支持 iOS 15 及更高版本&#xff0c;则可以通过聚焦和取消聚焦来激活和关闭文本字段的键盘。 在最简单的形式中&#xff0c;这是使用 FocusState 属性包装器和 focusable() 修饰符完成的-第一个存储一个布尔值&#xff0c;用于跟踪第二个当前是否被聚焦。 Code struct C…

视频直播美颜sdk与计算机视觉的奇妙结合

在数字时代&#xff0c;视频直播已经成为了人们分享生活、娱乐互动的重要方式之一。而随着社交媒体和在线直播平台的不断发展&#xff0c;用户们对于直播质量和体验提出了越来越高的要求。其中之一就是美颜效果。美颜不仅仅是为了矫正自身缺陷&#xff0c;它更是一种增强直播吸…

牛客练习赛116

(0条未读通知) 牛客练习赛116_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com) A.等差数列 对于此题可以分为两类&#xff1a; 1.当k 0&#xff0c;此时A1,A2...值都为a 2.当k ! 0,此时又分为两大类&#xff1a; 1.平局&#xff08;发现A1,A2,A3等连…

Automation Anywhere推出新的生成式AI自动化平台,加速提高企业生产力

在9 月 19 日的Imagine 2023 大会上&#xff0c;智能自动化领域的领导者 Automation Anywhere 宣布对其自动化平台进行扩展。推出了新的 Responsible AI Layer&#xff0c;并宣布了四项关键产品更新&#xff0c;包括全新的 Autopilot&#xff0c;它可以利用生成式 AI &#xff…

堆的介绍与堆的实现和调整

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 ​​堆的介绍&#xff1a; 关于堆的实现及相关的其他问题&#xff1a; 堆的初始化&#xff1a; 堆的销毁&#xff1a; 插入建堆&#xff1a; 堆向上调整&#xff1a; 交换两个节点的值&#xff1a; 堆向下调整&a…

SpringCache -- Redis --- 配置与缓存使用--配置过期时间

写在前面&#xff1a; 学redis&#xff0c;还是得搭配SpringCache来玩一玩。 前置内容 win安装redis基础 springboot使用redis 文章目录 导入依赖配置cache 使用CacheableCachePutCacheEvict 配置过期时间依据cacheName设置在注解上截取过期时间 导入依赖 <!--redis依赖…

邓俊辉《数据结构》→ “2.6.5 二分查找(版本A)”之“成功查找长度”递推式推导

【问题描述】 邓俊辉的《数据结构&#xff08;C语言版&#xff09;&#xff08;第3版&#xff09;》&#xff08;ISBN&#xff1a;9787302330646&#xff09;中&#xff0c;开始于第48页的“2.6.5 二分查找&#xff08;版本A&#xff09;”内容在第50页详述了“成功查找长度”的…

uniapp 点击事件-防重复点击

uniapp 点击事件-防重复点击 1、common文件并创建anti-shake.js文件 // 防止处理多次点击 function noMoreClicks(methods, info) {// methods是需要点击后需要执行的函数&#xff0c; info是点击需要传的参数let that this;if (that.noClick) {// 第一次点击that.noClick f…

vue循环滚动字幕

在Vue.js中创建一个循环滚动字幕的效果通常需要使用一些CSS和JavaScript来实现。以下是一个简单的示例&#xff0c;展示如何使用Vue.js创建一个循环滚动字幕的效果&#xff1a; 首先&#xff0c;在HTML中创建一个Vue实例&#xff0c;并添加一个包含滚动字幕的容器元素&#xff…

vue消息订阅与发布

1.知识点 是一种组件间通信的方式&#xff0c;适用于任意组件间通信 2.使用步骤 “消息订阅与发布”可依赖的第三方很多&#xff0c;这里使用pubsub-js库 1.安装pubsub&#xff1a;npm i pubsub-js 2.引入&#xff1a;import pubsub from pubsub-js 3.接收数据&#xff1a;A组件…