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

现代Qt开发教程(新手篇)1.5——变体与类型系统

现代Qt开发教程新手篇1.5——变体与类型系统相关仓库仍然已经开源正在积极火热的建设之中欢迎各位大佬提Issue和PR链接地址https://github.com/Awesome-Embedded-Learning-Studio/Tutorial_AwesomeQtPS: 嵌入式Linux的部分笔者还在研究驱动如何讲是合适的可能imx-forge的相关内容不得不托更几天确保质量准确这里特别给所有关心相关内容的朋友说明一下前言为什么需要万能类型说实话第一次见到 QVariant 的时候我心里是拒绝的。C 是强类型语言搞个什么都能装的容器这不是开历史倒车吗但等到你要写一个能同时存储 int、double、string 甚至自定义类型的配置系统时你会发现 QVariant 真香。QVariant 是 Qt 的万能容器它可以存储绝大多数 Qt 支持的类型。这在很多场景下非常有用比如解析 JSON 时你根本不知道下一个值是什么类型、比如做一个属性编辑器要支持各种数据类型、比如写一个通用的消息传递系统。这些问题用传统 C 方案要么写一堆 overload要么上模板把代码搞得像迷宫而 QVariant 提供了一个相对优雅的解决方案。不过这个万能是有代价的。类型安全检查只能到运行时用错了要等到程序跑起来才会炸。所以我们用 QVariant 的时候要格外小心该检查类型的时候千万别偷懒。环境说明本文代码基于 Qt 6.5 版本QVariant 在 Qt 6 中有一些行为变化主要是隐式转换被禁用这一点后面会专门说。如果你还在用 Qt 5某些写法可能需要调整。核心概念讲解QVariant 是什么从底层看 QVariant 就是一个带了类型标签的值容器。它内部维护一个类型 ID 和一块内存内存里存着实际的数据。你可以往里面塞 int塞 QString塞自定义类型只要你告诉 QVariant 这是什么类型它就能正确地存和取。先看个最简单的例子// 存储不同类型的值QVariant v142;// 存储 intQVariant v23.14;// 存储 doubleQVariant v3QString(Hello Qt);// 存储 QStringQVariant v4QColor(255,0,0);// 存储 QColor// 取出值注意要指定类型intiv1.toInt();// 42doubledv2.toDouble();// 3.14QString sv3.toString();// Hello QtQColor cv4.valueQColor();// QColor(255, 0, 0)你会发现存值很简单直接赋值就行。取值的时候要调用对应的转换函数或者用valueT()模板方法。这里有个关键点如果类型不匹配会怎样比如 v1 里存的是 int你调用toDouble()会怎样答案是 QVariant 会尝试做类型转换int 可以转成 double没问题。但如果 v3 存的是字符串你调用toInt()会怎样如果字符串内容不是数字转换失败会返回 0。这就是 QVariant 的坑点之一类型转换失败时你得不到明确的错误只能得到一个默认值。所以当你不确定类型时一定要先检查。常用类型的存储与提取Qt 已经为大多数内置类型注册了元类型可以直接用 QVariant 存储。这里列出一些最常用的类型存储方式提取方式int, double, float 等直接赋值toInt(), toDouble(), toFloat()QString直接赋值toString()bool直接赋值toBool()QList, QMap直接赋值toList(), toMap()QColor, QFont, QSize 等直接赋值value()自定义类型用 QVariant::fromValue()value()下面是一个稍微完整点的例子展示几种典型用法// 基本类型QVariant v142;QVariant v2true;QVariant v33.14;qDebug()v1.toInt()v2.toBool()v3.toDouble();// 字符串QVariant v4QString(Hello);qDebug()v4.toString();// 列表和映射QListQVariantlist{1,two,3.0};QVariant v5QVariant::fromValue(list);QMapQString,QVariantmap;map[name]Qt;map[version]6.5;QVariant v6QVariant::fromValue(map);注意这里的QVariant::fromValue()对于像 QList、QMap 这样的模板类型直接赋值可能有问题用fromValue()更保险。Qt 6 里这个问题更明显因为它禁用了一些隐式转换。类型检查的重要性刚才说到类型转换失败会返回默认值这可能导致你得到错误的结果而不自知。所以每次取值前最好先检查一下类型QVariant v123;// 不安全的做法直接转换intnumv.toInt();// 可能得到 123也可能得到别的// 安全的做法先检查类型if(v.type()QVariant::Int){intnumv.toInt();// 使用 num}elseif(v.type()QVariant::String){QString sv.toString();boolok;intnums.toInt(ok);if(ok){// 使用 num}}// 或者用 typeIdQt 6 推荐if(v.typeId()QMetaType::Int){// ...}type()返回的是QVariant::Type枚举这个在 Qt 6 里已经被标记为废弃推荐用typeId()配合QMetaType。但为了兼容性很多代码还在用type()。还有一个canConvert()方法它可以告诉你 QVariant 能否转换成目标类型QVariant v123;if(v.canConvertint()){intnumv.toInt();// 转换成功}QVariant v2hello;if(v2.canConvertint()){intnumv2.toInt();// 返回 0但 canConvert 可能说可以}这里有个坑canConvertint()对字符串来说总是返回 true因为字符串理论上可以转成 int即使是 “hello”。所以canConvert只是一个粗略的检查真正关键还是要看转换后的值是否合理。QMetaType 类型注册如果你想用 QVariant 存储自定义类型需要先把这个类型注册到 Qt 的元对象系统中。注册很简单用Q_DECLARE_METATYPE()宏// 在头文件中声明自定义类型structPerson{QString name;intage;};// 注册类型放在头文件中类定义之后Q_DECLARE_METATYPE(Person)// 现在可以用 QVariant 存储 PersonPerson p{Alice,30};QVariant vQVariant::fromValue(p);// 取出时也要用 valueT()Person p2v.valuePerson();注意注册要放在头文件中因为所有用到这个类型的地方都需要看到这个声明。如果你的类型在 cpp 文件中定义那就在 cpp 文件中注册。踩坑预防清单⚠️ 坑 #1忘记检查类型就转换❌ 错误做法QVariant vgetUserInput();// 不知道是什么类型intnumv.toInt();// 直接转换// 使用 num... ✅ 正确做法 cpp QVariant v getUserInput(); if (v.type() QVariant::Int || v.type() QVariant::Double) { int num v.toInt(); // 使用 num... } else { // 处理类型不匹配的情况 } 后果如果 v 里存的是字符串 “hello”toInt() 会返回 0你可能以为用户输入的是 0实际是错误的。 一句话记住取出 QVariant 的值前先问自己一句这真的对吗然后检查类型。⚠️ 坑 #2Qt 6 的隐式转换问题❌ 错误做法// Qt 5 可以这样写Qt 6 可能编译不过QListQVariantlist;list1two3.0; ✅ 正确做法 cpp // Qt 6 推荐写法 QListQVariant list {1, two, 3.0}; // 或者显式转换 QListQVariant list; list.append(QVariant(1)); list.append(QVariant(two)); list.append(QVariant(3.0)); 后果Qt 6 禁用了某些隐式转换直接用可能编译失败。 一句话记住Qt 6 里类型转换要显式点别指望编译器猜。⚠️ 坑 #3自定义类型没注册❌ 错误做法structPoint{intx,y;};// 忘记 Q_DECLARE_METATYPE(Point)Point p{1,2};QVariant vQVariant::fromValue(p);// 返回无效的 QVariant ✅ 正确做法 cpp struct Point { int x, y; }; Q_DECLARE_METATYPE(Point) // 记得注册 Point p{1, 2}; QVariant v QVariant::fromValue(p); // 正常工作 Point p2 v.valuePoint(); 后果没注册的类型存进 QVariant 会得到一个无效的 QVariant取出来也是垃圾值。 一句话记住自定义类型想进 QVariant先去 Q_DECLARE_METATYPE 报个到。随堂测验 口述回答用自己的话说说QVariant 和 C 的 std::any 有什么区别为什么 Qt 要搞自己的万能类型而不是用标准库的 代码填空// 下面代码想把一个 QVariant 里的值转换成字符串输出// 但有时候转换会失败请补全错误处理QVariant vgetSomeValue();QString str;if(v.type()QVariant::String){strv.______(1)______;}elseif(v.canConvertQString()){strv.______(2)______;}else{str____((unknown type));}qDebug()Value:str; 调试挑战这段代码想从用户输入读取一个数字但有一个 bug。问题在哪里QVariant inputQLineEdit::text();// 假设这是用户输入intnumberinput.toInt();// 转换成数字if(number100){qDebug()数字太大;}练习项目 练习项目简易配置编辑器 功能描述实现一个配置文件编辑器可以读取、修改、保存配置项。每个配置项都有一个名称和一个 QVariant 值支持 int、double、bool、string 等类型。✅ 完成标准定义一个Config类内部用QMapQString, QVariant存储配置项实现set(),get(),save(),load()方法get()方法要支持默认值如果配置项不存在返回默认值save()把配置保存到 JSON 文件load()从 JSON 文件加载配置写一个 main 函数演示如何使用这个 Config 类 提示用 QJsonDocument 处理 JSON 读写从 JSON 读值时得到的就是 QVariant直接存就行保存时注意处理不同类型QJsonObject 支持大多数 QVariant 类型官方文档参考链接 Qt 文档 · QVariant · QVariant 完整 API 参考必查文档 Qt 文档 · QMetaType · 了解 Qt 的类型系统和元类型注册机制 Qt 文档 · Container Classes · Qt 容器类与 QVariant 配合使用的说明相关阅读入门 · 环境搭建 · 00 · Qt6 安装踩坑指南 - 相似度 100%现代Qt开发——0.1——如何在IDE中配置Qt环境 - 相似度 100%现代Qt开发教程新手篇1.3——字符串与编码 - 相似度 100%

相关文章:

现代Qt开发教程(新手篇)1.5——变体与类型系统

现代Qt开发教程(新手篇)1.5——变体与类型系统 相关仓库仍然已经开源,正在积极火热的建设之中,欢迎各位大佬提Issue和PR! 链接地址:https://github.com/Awesome-Embedded-Learning-Studio/Tutorial_Awesome…...

Netty 参数配置

1.SO_BACKLOG 作用:服务端配置参数,用于设置服务器监听套接字的连接请求队列的最大长度。用途:控制的是‌已完成三次握手但尚未被 accept() 处理的连接队列‌的大小。如果这个队列满了,新的连接请求会被拒绝,导致客户端…...

嵌入式C++工程实践——第13篇:第一次重构 —— enum class取代宏,类型安全的开始

嵌入式C工程实践——第13篇:第一次重构 —— enum class取代宏,类型安全的开始 仓库已经开源!仍然在持续建设中,喜欢的话点个⭐!相关的链接如下: https://github.com/Awesome-Embedded-Learning-Studio/Tut…...

Qwen2.5-72B-Instruct-GPTQ-Int4开源镜像实操:资源用量监控与成本核算模板

Qwen2.5-72B-Instruct-GPTQ-Int4开源镜像实操:资源用量监控与成本核算模板 1. 模型简介与部署准备 Qwen2.5-72B-Instruct-GPTQ-Int4是通义千问大模型系列的最新版本,经过4-bit GPTQ量化处理后的72B参数指令调优模型。这个版本在多个方面都有显著提升&a…...

零基础玩转李慕婉AI绘画:手把手教你用Z-Turbo镜像生成仙逆同人图

零基础玩转李慕婉AI绘画:手把手教你用Z-Turbo镜像生成仙逆同人图 1. 为什么你需要试试这个镜像?从想法到画面的距离,可能只有几秒钟 如果你和我一样,是《仙逆》的读者或观众,心里一定有过这样的念头:要是…...

DownKyi视频下载工具:从网络限制到自由收藏的完整解决方案

DownKyi视频下载工具:从网络限制到自由收藏的完整解决方案 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&a…...

微信聊天记录解密:三步找回你的数字记忆宝藏

微信聊天记录解密:三步找回你的数字记忆宝藏 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾因手机损坏而焦虑那些珍贵的微信聊天记录?那些包含工作重要信息、家庭温馨对话…...

Rust的闭包中的互操作性

Rust的闭包以其灵活性和高效性闻名,但在与其他语言或系统交互时,互操作性成为关键挑战。闭包作为一等公民,既能捕获环境变量,又能作为参数传递,但在跨语言调用或与C接口交互时,其实现机制可能引发兼容性问题…...

06. Python函数基础:从基础封装到高阶应用与算法实战

温故知新:从字符到函数的进阶之路在上一节的学习旅程中,我们深入探索了Python中字符串的奇妙世界。我们不仅掌握了字符串的索引与切片操作,学会了如何像手术刀一样精准地提取数据,还熟悉了各种实用的内置方法,如大小写…...

Qwen2.5-72B-GPTQ-Int4惊艳效果:多轮数学证明生成+中间步骤可追溯展示

Qwen2.5-72B-GPTQ-Int4惊艳效果:多轮数学证明生成中间步骤可追溯展示 1. 引言:当大模型遇上数学推理 如果你尝试过让AI帮你解决数学问题,可能会遇到这样的困扰:它要么直接给出一个最终答案,让你摸不着头脑&#xff1…...

ClearerVoice-Studio语音处理全流程:电话/直播/会议多采样率适配方案

ClearerVoice-Studio语音处理全流程:电话/直播/会议多采样率适配方案 1. 开箱即用的语音处理利器 你是否遇到过这样的困扰:重要的会议录音背景噪音太大,直播时环境嘈杂影响效果,或者需要从多人对话中提取特定人物的声音&#xf…...

OpenClaw vs Hermes Agent:2026 年最强 AIAgent 框架深度对比,谁更适合你?

OpenClaw vs Hermes Agent:2026 年最强 AI Agent 框架深度对比 摘要:随着 AI Agent 技术的爆发式增长,OpenClaw 和 Hermes Agent 成为了 2026 年最受关注的两大开源框架。本文将从架构设计、技能系统、记忆机制、安全性、适用场景等维度进行深度对比,帮助你选择最适合的 AI…...

终极指南:3分钟免费重置JetBrains IDE试用期,轻松突破30天限制 [特殊字符]

终极指南:3分钟免费重置JetBrains IDE试用期,轻松突破30天限制 🚀 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 还在为JetBrains IDE试用期到期而烦恼吗?ide-eval…...

2006-2023年各省工业机器人安装密度数据

2006-2023年各省工业机器人安装密度数据 1、时间:2006-2023年 2、来源:IFR国际机器人联合会 3、指标:年份、省份代码、省份、所属地域、工业机器人安装密度_台 4、范围:31省 5、说明:根据IRF联盟公布的中国各行业…...

分布式系统最佳实践

分布式系统最佳实践:构建高可用的现代架构 在当今数字化时代,分布式系统已成为支撑大规模应用的核心技术。无论是电商平台、金融系统还是云计算服务,分布式架构的高可用性、可扩展性和容错能力都是关键需求。分布式系统的复杂性也带来了诸多…...

记忆与上下文管理:短期会话、长期记忆与检索边界怎么设计(含分层策略与实现要点)

专栏第 9 篇:解决 Agent 项目中“记不住、记太多、记错了”的三大问题。一、问题描述:为什么记忆系统总在“要么失忆,要么混乱” 随着 Agent 使用时长增加,典型问题会出现: 对话一长就丢上下文;什么都往长期…...

突破《原神》60FPS限制:从卡顿到流畅的完整实战指南

突破《原神》60FPS限制:从卡顿到流畅的完整实战指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 你是否曾因《原神》的60FPS限制而感到束手无策?当你拥有高性能…...

质检主管的自述:职业天花板的叹息,难道只是永远的低声下气?

技术背景介绍:AI智能体视觉检测系统(TVA,全称为“Transformer-based Vision Agent”),即基于Transformer架构以及“因式智能体”创新理论的高精度视觉智能体,并非传统机器视觉软件或者早期AI视觉技术&#…...

Meshlab新手必看:STL模型中心化与Poisson采样点云化完整流程

Meshlab新手必看:STL模型中心化与Poisson采样点云化完整流程 刚接触三维建模时,我总被各种专业软件的操作界面吓退——直到遇见Meshlab这款开源神器。它就像一位耐心的导师,用简洁的界面承载着强大的三维处理能力。特别是在处理3D扫描获得的S…...

SBTI 人格测试源码分析:一个完整的纯前端心理测试项目(附源码)

SBTI 人格测试源码分析:一个完整的纯前端心理测试项目项目来源:52IIS 在线工具箱作者整理开源 开源地址:https://github.com/52IIS/52IIS_Tools/tree/main/public/SBTI 52IIS部署:https://www.52iis.com/SBTI/index.html最近看到一…...

《SRE:Google 运维解密》读书笔记06: 少琐事 - SRE的隐形敌人

作者: andylin02 学习章节:第5章 减少琐事(Eliminating Toil) 关键词:琐事、Toil、自动化、50%规则、工程工作、职业发展 一、引言:琐事——SRE的隐形敌人 在日常运维工作中,总有一些反复出现、消耗大量精…...

新手蓝队入门:用D盾和日志分析实战Web应急响应(知攻善防靶场复盘)

新手蓝队入门:用D盾和日志分析实战Web应急响应 刚接触网络安全运营的新人,面对突发安全事件时往往手足无措。本文将以知攻善防实验室的Web靶场为例,带你从零开始构建应急响应思维框架。不同于简单的题解记录,我们将重点拆解工具使…...

5分钟掌握Blender 3MF插件:免费开源3D打印格式完美解决方案

5分钟掌握Blender 3MF插件:免费开源3D打印格式完美解决方案 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 想要在Blender中轻松处理3D打印文件吗&#xff1f…...

新手必看:用Wireshark从BUUCTF MISC流量包中找Flag的保姆级实战(附HTTP过滤技巧)

零基础通关BUUCTF流量分析:Wireshark实战技巧与Flag挖掘指南 第一次打开Wireshark时,满屏跳动的数据包就像天书般令人望而生畏。作为CTF竞赛中最常见的题型之一,流量分析看似门槛极高,实则掌握几个核心技巧就能快速入门。本文将带…...

计算机网络深度解析:篡改(Tampering)是否属于主动攻击?——从安全模型到实战攻防的万字全解

🌐 计算机网络深度解析:篡改(Tampering)是否属于主动攻击?——从安全模型到实战攻防的万字全解 作者:培风图南以星河揽胜 发布于:2026年4月12日 📌 核心摘要 本文系统性地解答了“在…...

如何快速提升研究效率:Zotero-GPT完整使用秘籍

如何快速提升研究效率:Zotero-GPT完整使用秘籍 【免费下载链接】zotero-gpt GPT Meet Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-gpt Zotero-GPT是一个革命性的AI文献助手,它将GPT智能能力无缝集成到Zotero文献管理软件中&…...

花了两天,让Trae,给我用魔珐星云数字人写了个项目!

文章目录注意代码视频演示项目背景与痛点2.1 行业与社会背景2.2 现有场景的核心痛点分析2.3 项目切入价值总结产品核心功能3.1 语音驱动的自然交互数字人3.2 基于位置感知的智能导航与指路服务(行)3.3 智能科室引导与就医辅助(医)…...

你的浏览器也能轻松聊微信:wechat-need-web插件完全指南

你的浏览器也能轻松聊微信:wechat-need-web插件完全指南 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为无法在浏览器中使用微信网页…...

5分钟解锁微信网页版:wechat-need-web插件完整使用指南

5分钟解锁微信网页版:wechat-need-web插件完整使用指南 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为无法在浏览器中使用微信而烦…...

2026-04-16 全国各地响应最快的 BT Tracker 服务器(移动版)

数据来源:https://bt.me88.top 序号Tracker 服务器地域网络响应(毫秒)1http://60.249.37.20:80/announce广东惠州移动382http://211.75.205.187:6969/announce广东深圳移动403udp://107.189.7.165:6969/announce北京移动1234http://107.189.2.131:1337/announce北京…...