Qt扫盲-QVariant理论使用总结

2023-11-09

一、概述

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 int
  int x = v.toInt();              // x = 123
  out << v;                       // Writes a type tag and an int to out
  v = QVariant("hello");          // The variant now contains a QByteArray
  v = QVariant(tr("hello"));      // The variant now contains a QString
  int y = v.toInt();              // y = 0 since v cannot be converted to an int
  QString 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 variant
  int z = v.toInt();              // z = 123
  qDebug("Type is %s",            // prints "Type is int"
          v.typeName());
  v = v.toInt() + 100;            // The variant now hold the value 223
  v = 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() 指示是否已经转换成功的。

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

Qt扫盲-QVariant理论使用总结 的相关文章

随机推荐

  • 一文搞清原码,反码,补码及其应用

    三码 之间的转换 注意 以下的分析均以 1字节 进行 正数 负数 原码 数据的二进制形式 数据的二进制形式 反码 等于原码 原码的符号位不变 其他位取反 补码 等于原码 负数的反码 1 注意 无符号数 正数 它们的 原码 反码 补码 负数
  • 微信公众号--根据用户opneId获取用户信息

    一 登录微信公众号的测试环境 找到 网页授权获取用户基本信息 点击修改 添加上自己的回调地址域名 测试时可以写IP 端口号 正式环境只支持域名不要写http 或https 二 步骤 1 用户同意授权 获取code 参考链接 https op
  • # 数字、字符类型校验码识别

    数字 字符类型校验码识别 import ddddocr ocr ddddocr DdddOcr show ad False with open r 10 2 21 99 战略规划部共享盘 影刀数据存储 26 海王星辰 验证码图片 海王验证码
  • 推荐系统详解

    1 基于内容的推荐系统 1 基于内容的推荐算法概述 基于内容的推荐算法 Content based Recommendations CB 也是一种工业界应用比较广的一种推荐算法 由于协同过滤推荐算法中仅仅基于用户对于商品的评分进行推荐 所以
  • 【已解决】Android Studio Cannot resolve symbol '@dimen/activity_vertical_margin'

    Android Studio中dimens xml是用来存储部件尺寸大小的配置文件 我们可以将配置存储在dimens xml中 就可以使多个部件使用同样的值而只需更改一次 dimens xml路径为app gt src gt main gt
  • springboot整合rabbitmq

    目录 一 rabbitmq的相关概念 概念说明 二 相关步骤 整合springbbot 三 具体实现和对应的原理 1 配置rabbitmq的文件 2 配置configuration文件 配置连接 3 创建exchange 4 创建队列 5
  • 触发器实现模5加法计数器

    触发器实现模5加法计数器 个人的小实验 写个文章记录一下 注 multism中没有找到T 触发器 用JK触发器两端接1来替代 JK触发器功能表如下 因为 2 2 lt 5 lt 2
  • solidworks如何调整视图方向

    https jingyan baidu com article 14bd256e9185a5bb6d2612bd html
  • 应届程序员一年能挣多少钱?字节跳动员工:存款40万,感觉良好

    程序员是公认的高薪 不过很多人都说刚毕业的程序员收入并不会太高 有一些人可能收入还不过万的 只有工作个三五年经验跟技术充足了 那收入才是非常可观的 所以对于应届生来说 就算是程序员收入也一般 不过这可能只是指小公司的程序员 如果刚毕业就入职
  • 第三章 索引

    文章目录 一 索引器 1 表的列索引 2 序列的行索引 WARNING 关于索引类型的说明 END 3 loc索引器 练一练 END WARNING 不要使用链式赋值 END 4 iloc索引器 5 query方法 NOTE query中引
  • python之出现unresolved reference解决方法

    在目录上面右键点击选择Mark Directory As Sources root 将你的目录添加sources root 就可以解决了
  • Docker镜像的创建(配置生成docker镜像和dockerfile构建Tomcat)

    一 配置生成docker镜像 1 配置基于运行的容器生成镜像 并部署Apache服务 2 通过已有镜像生成新的镜像 https download openvz org template precreated centos 7 x86 64
  • shell运行python

    为了能在shell页面运行python程序 我们将复杂的python程序可以封装到shell里面 第一种 直接调用PY文件 这里必须保证py文件在前面这个路径下面方可 bin bash appcom anaconda bin python
  • mbp适合程序员_程序员入手mbp一月感受

    网上很多人推荐程序员使用macbookpro 说是最适合程序员的电脑 刚好新公司需要使用mac 趁着暑假教育优惠 入手了2020 13寸 2 0Ghz的mbp 一个月使用感受大致如下 1 macos和服务器上的linux系统环境差异比较大
  • R--基础知识总结

    R程序包的安装和加载 install packageS TSA library TSA R向量 vector 数值向量 1 赋值 x lt c 1 2 3 4 assign x c 1 2 3 4 x c 1 2 3 4 x lt 2 1
  • 【SpringBoot应用篇】SpringBoot+MybatisPlus集成国产DM8(达梦)数据库

    SpringBoot应用篇 SpringBoot MybatisPlus集成国产DM8 达梦 数据库 简介和安装 基本概念介绍 SpringBoot MP整合DM8 pom yml Address AddressMapper 启动类 测试类
  • CESM:手动inputdata

    参考教程 CESM2笔记 porting 新机器移植 cesm2创建case J同学的大气笔记的博客 CSDN博客 ftp链接失效 试试通过cmd下载cam学习材料 cesm为什么不能直接下载数据 J同学的大气笔记的博客 CSDN博客 ca
  • QTreeView默认选中某个节点的方法

    最近使用Qt做个界面 使用了QTreeView显示一个树形数据 想在界面打开时 默认选中某个节点 网上搜索全是MFC的TreeView的 在这里记一下QTreeView的方法 QTreeView的基本使用 QStandardItemMode
  • Django知识点

    MTV M 模型 model 主要操作数据库等 T 模板 template 代替了MVC模型的view 主要定义前端 调用view等 V 视图 view 代替MVC模型的controller 主要接受用户请求 调用model 调用templ
  • Qt扫盲-QVariant理论使用总结

    Qt扫盲 QVariant理论使用总结 一 概述 二 使用用例 三 关于GUI类型的说明 四 连续使用canConvert 和convert 一 概述 QVariant 是一个用来存放变体数据的工具类 因为c 禁止 union 包含具有非默