QtC++与QVariant详解

什么是 QVariant?

QVariant 是 Qt 中的一个类,允许您以一种通用的方式存储和访问数据,即使这些数据具有不同的数据类型。它在许多情况下非常有用,例如在模型视图编程、数据序列化、设置和配置管理等领域。QVariant 可以包含以下类型的数据:

基本数据类型,如整数、浮点数、布尔值、枚举等。
Qt 内置的数据类型,如 QString、QByteArray、QDate、QTime、QDateTime 等。
用户自定义的数据类型,只要您为其定义了 QVariant 转换函数

丰富的示例

#include <QCoreApplication>
#include <QVariant>
#include <QDebug>
#include <QDate>
#include <QTime>
#include <QDateTime>
#include <QByteArray>
#include <QStringList>
#include <QColor>
#include <QFont>
#include <QPoint>
#include <QSize>
#include <QRect>
#include <QMetaType>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建一个QVariant对象并设置其值QVariant var;// 1. 整数int intValue = 42;var = QVariant(intValue);// 2. 浮点数double doubleValue = 3.14159;var = QVariant(doubleValue);// 3. 字符串QString stringValue = "Hello, QVariant!";var = QVariant(stringValue);// 4. 布尔值bool boolValue = true;var = QVariant(boolValue);// 5. 列表QVariantList list;list.append(1);list.append("Two");list.append(3.0);var = QVariant(list);// 6. MapQVariantMap map;map["name"] = "Alice";map["age"] = 30;map["isStudent"] = false;var = QVariant(map);// 7. 枚举enum Color { Red, Green, Blue };Color colorValue = Blue;var = QVariant(colorValue);// 8. 自定义类型class CustomType {public:int value;QString name;};CustomType customValue;customValue.value = 123;customValue.name = "Custom";var = QVariant::fromValue(customValue);// 9. 数据类型检查if (var.type() == QVariant::Int) {int intValue = var.toInt();}// 10. 数据类型转换QString strValue = var.toString();// 11. 比较QVariant anotherIntValue = QVariant(42);if (var == anotherIntValue) {qDebug() << "var is equal to anotherIntValue";}// 12. 访问Map中的值QVariantMap mapValue = var.toMap();QString name = mapValue["name"].toString();int age = mapValue["age"].toInt();// 13. 获取枚举值名称QString enumName = var.typeName();// 14. 清空QVariantvar.clear();// 15. 判断QVariant是否为空if (var.isNull()) {qDebug() << "var is null";}// 其他高级方法:// 16. QVariant类型的自省QVariant::Type type = var.type();// 17. QVariant的详细类型信息const QMetaObject *metaObject = var.metaObject();// 18. 类型是否可转换bool canConvert = var.canConvert(QVariant::Int);// 19. 从字符串创建QVariantQVariant fromStringVar = QVariant::fromValue("42");// 20. 将QVariant转为JSONQJsonObject jsonObject = var.toJsonValue().toObject();// 21. 将JSON转为QVariantQVariant fromJsonVar = QVariant::fromValue(jsonObject);// 22. 根据类型名创建QVariantQVariant typeVar = QVariant::fromType(QMetaType::Int);// 23. 使用 QVariantList 创建 QVariantQVariantList listVar;listVar << 1 << 2 << 3;// 24. 使用 QVariantMap 创建 QVariantQVariantMap mapVar;mapVar["name"] = "John";mapVar["age"] = 25;// 25. QVariant的复制QVariant copyVar = var;// 26. 使用 QVariantList 创建 QVariantQVariantList listVar2 = QVariantList() << 4 << 5 << 6;// 27. 检查是否有值if (var.isValid()) {qDebug() << "var is valid";}// 28. 获取 QVariant 内部数据指针const void *dataPtr = var.constData();// 29. 获取 QVariant 内部数据大小int dataSize = var.dataSize();// 30. 使用自定义转换函数QVariant customConvertedVar = var.value<CustomType>();// 31. QDateQDate dateValue(2023, 11, 4);var = QVariant(dateValue);// 32. QTimeQTime timeValue(14, 30);var = QVariant(timeValue);// 33. QDateTimeQDateTime dateTimeValue(QDate(2023, 11, 4), QTime(14, 30));var = QVariant(dateTimeValue);// 34. QByteArrayQByteArray byteArrayValue = QByteArray("Hello, QVariant!");var = QVariant(byteArrayValue);// 35. QStringListQStringList stringListValue;stringListValue << "One" << "Two" << "Three";var = QVariant(stringListValue);// 36. QColorQColor colorValue(255, 0, 0); // 红色var = QVariant(colorValue);// 37. QFontQFont fontValue("Arial", 12);var = QVariant(fontValue);// 38. QPointQPoint pointValue(100, 200);var = QVariant(pointValue);// 39. QSizeQSize sizeValue(300, 400);var = QVariant(sizeValue);// 40. QRectQRect rectValue(100, 100, 300, 200);var = QVariant(rectValue);// 41. QVariantList,嵌套QVariantQVariantList nestedList;nestedList << QVariant(1) << QVariant("Nested") << QVariant(3.0);QVariant nestedVar = QVariant(nestedList);var = QVariant(nestedVar);// 42. QVariantMap,嵌套QVariantQVariantMap nestedMap;nestedMap["key1"] = QVariant(42);nestedMap["key2"] = QVariant("Nested");QVariant nestedMapVar = QVariant(nestedMap);var = QVariant(nestedMapVar);// 43. 多个类型混合的QVariantListQVariantList mixedList;mixedList << QVariant(42) << QVariant("Mixed") << QVariant(QDate(2023, 11, 4));var = QVariant(mixedList);// 44. 使用toXxx()函数获取值int intValue = var.toInt();double doubleValue = var.toDouble();QString stringValue = var.toString();QDate date = var.toDate();QTime time = var.toTime();QDateTime dateTime = var.toDateTime();QByteArray byteArray = var.toByteArray();QStringList stringList = var.toStringList();QColor color = var.value<QColor>();QFont font = var.value<QFont>();QPoint point = var.value<QPoint>();QSize size = var.value<QSize>();QRect rect = var.value<QRect>();// 45. 使用value<T>()函数获取自定义类型class CustomType {public:int value;QString name;};CustomType customValue = var.value<CustomType>();// 46. 使用constData()获取数据指针const void *dataPtr = var.constData();// 47. 检查是否为空if (var.isNull()) {qDebug() << "var is null";}// 48. 获取类型名称QString typeName = var.typeName();// 49. 将QVariant转为JSON字符串QString jsonStr = QVariant::fromValue(var).toJsonValue().toString();// 50. 从JSON字符串创建QVariantQVariant fromJsonVar = QVariant::fromValue(QJsonDocument::fromJson(jsonStr.toUtf8()).toVariant());// 51. QListQList<int> intList;intList << 1 << 2 << 3;var = QVariant::fromValue(intList);// 52. QVectorQVector<QString> stringVector;stringVector << "One" << "Two" << "Three";var = QVariant::fromValue(stringVector);// 53. QMapQMap<QString, int> stringIntMap;stringIntMap["One"] = 1;stringIntMap["Two"] = 2;var = QVariant::fromValue(stringIntMap);// 54. QStringListQStringList stringList;stringList << "Apple" << "Banana" << "Cherry";var = QVariant::fromValue(stringList);// 55. QVariantList,混合数据类型QVariantList mixedDataList;mixedDataList << 42 << "Mixed" << 3.14;var = QVariant(mixedDataList);// 56. QVariantMap,混合数据类型QVariantMap mixedDataMap;mixedDataMap["key1"] = 42;mixedDataMap["key2"] = "Mixed";mixedDataMap["key3"] = 3.14;var = QVariant(mixedDataMap);// 57. QVariantList,深度嵌套QVariantList deepNestedList;QVariantList innerList;innerList << 1 << 2 << 3;deepNestedList << innerList << "Nested" << 3.14;var = QVariant(deepNestedList);// 58. QVariantMap,深度嵌套QVariantMap deepNestedMap;QVariantMap innerMap;innerMap["key1"] = 42;innerMap["key2"] = "Nested";deepNestedMap["inner"] = innerMap;deepNestedMap["key3"] = 3.14;var = QVariant(deepNestedMap);// 59. QVariantMap,枚举类型enum Fruit { Apple, Banana, Cherry };QVariantMap enumMap;enumMap["fruit"] = Fruit::Apple;var = QVariant(enumMap);// 60. QVariantList,枚举类型QVariantList enumList;enumList << Fruit::Apple << Fruit::Banana << Fruit::Cherry;var = QVariant(enumList);// 61. QVariantList,指针类型int* intPointer = new int(42);var = QVariant::fromValue(intPointer);// 62. QVariantList,QSharedPointer类型QSharedPointer<int> sharedInt = QSharedPointer<int>(new int(42));var = QVariant::fromValue(sharedInt);// 63. QVariantList,自定义类指针class CustomType {public:int value;QString name;};CustomType* customPointer = new CustomType();customPointer->value = 42;customPointer->name = "CustomPointer";var = QVariant::fromValue(customPointer);// 64. QVariantList,QList指针QList<int>* intListPointer = new QList<int>();intListPointer->append(1);intListPointer->append(2);intListPointer->append(3);var = QVariant::fromValue(intListPointer);// 65. QVariantList,QMap指针QMap<QString, int>* stringIntMapPointer = new QMap<QString, int>();stringIntMapPointer->insert("One", 1);stringIntMapPointer->insert("Two", 2);var = QVariant::fromValue(stringIntMapPointer);// 66. QVariantList,QVariantList指针QVariantList* nestedListPointer = new QVariantList();nestedListPointer->append(1);nestedListPointer->append("Nested");var = QVariant::fromValue(nestedListPointer);// 67. QVariantList,QVariantMap指针QVariantMap* nestedMapPointer = new QVariantMap();(*nestedMapPointer)["key1"] = 42;(*nestedMapPointer)["key2"] = "Nested";var = QVariant::fromValue(nestedMapPointer);// 68. QVariantList,复合结构struct ComplexStruct {int intValue;QString stringValue;QMap<QString, QVariant> dataMap;};ComplexStruct complexValue = {42, "Complex", stringIntMap};var = QVariant::fromValue(complexValue);// 69. QVariantList,QVariant指针QVariant* varPointer = new QVariant(42);var = QVariant::fromValue(varPointer);// 70. QVariantList,QVariantList指针QVariantList* varListPointer = new QVariantList();varListPointer->append(1);varListPointer->append("Nested");var = QVariant::fromValue(varListPointer);// 71. QVariantList,QVariantMap指针QVariantMap* varMapPointer = new QVariantMap();(*varMapPointer)["key1"] = 42;(*varMapPointer)["key2"] = "Nested";var = QVariant::fromValue(varMapPointer);// 72. 检查是否包含特定类型if (var.canConvert(QVariant::Int)) {int convertedInt = var.toInt();qDebug() << "Can convert to int: " << convertedInt;}// 73. 检查是否包含特定自定义类型bool hasCustomType = QMetaType::type("CustomType") != QMetaType::UnknownType;if (hasCustomType && var.canConvert(QMetaType::type("CustomType"))) {CustomType custom = var.value<CustomType>();qDebug() << "Can convert to CustomType: " << custom.value << custom.name;}// 74. 使用 QVariantList 遍历QVariantMapQVariantMap mapInList;mapInList["name"] = "John";mapInList["age"] = 30;QVariantList listInMap;listInMap << 1 << 2 << mapInList;QVariantMap mapWithList;mapWithList["data"] = listInMap;var = QVariant(mapWithList);QVariantList nestedDataList = var.toMap()["data"].toList();for (const QVariant& item : nestedDataList) {if (item.canConvert(QVariant::String)) {QString strValue = item.toString();qDebug() << "String in nested list: " << strValue;}else if (item.canConvert(QVariant::Map)) {QVariantMap mapValue = item.toMap();QString name = mapValue["name"].toString();int age = mapValue["age"].toInt();qDebug() << "Map in nested list: Name - " << name << ", Age - " << age;}}// 75. 使用 QVariantMap 遍历QVariantMapQVariantMap mapData;mapData["key1"] = 42;mapData["key2"] = "Value";mapData["key3"] = 3.14;var = QVariant(mapData);QVariantMap dataMap = var.toMap();for (const QString& key : dataMap.keys()) {QVariant value = dataMap[key];if (value.canConvert(QVariant::Int)) {int intValue = value.toInt();qDebug() << "Key: " << key << " - Int Value: " << intValue;}else if (value.canConvert(QVariant::String)) {QString strValue = value.toString();qDebug() << "Key: " << key << " - String Value: " << strValue;}else if (value.canConvert(QVariant::Double)) {double doubleValue = value.toDouble();qDebug() << "Key: " << key << " - Double Value: " << doubleValue;}}// 76. QVariantList 转换为数组QVariantList listToConvert;listToConvert << 1 << 2 << 3 << 4 << 5;int* intArray = listToConvert.data<int>();for (int i = 0; i < listToConvert.size(); ++i) {qDebug() << "Array Value: " << intArray[i];}// 77. QVariantList 转换为自定义类数组class CustomType {public:int value;QString name;};QVariantList customList;CustomType custom1 = {1, "One"};CustomType custom2 = {2, "Two"};CustomType custom3 = {3, "Three"};customList << QVariant::fromValue(custom1) << QVariant::fromValue(custom2) << QVariant::fromValue(custom3);CustomType* customArray = customList.data<CustomType>();for (int i = 0; i < customList.size(); ++i) {qDebug() << "Custom Array Value: " << customArray[i].value << customArray[i].name;}// 78. 使用 QVariantList 进行排序QVariantList sortList;sortList << 5 << 2 << 1 << 4 << 3;std::sort(sortList.begin(), sortList.end(), [](const QVariant& a, const QVariant& b) {return a.toInt() < b.toInt();});qDebug() << "Sorted List: " << sortList;// 79. 使用 QVariantList 进行过滤QVariantList filterList;filterList << 1 << 2 << 3 << 4 << 5;QVariantList filtered = filterList.filter([](const QVariant& value) {return value.toInt() % 2 == 0;});qDebug() << "Filtered List: " << filtered;// 80. 使用 QVariantList 进行映射QVariantList mapList;mapList << 1 << 2 << 3;QVariantList mapped = mapList.map([](const QVariant& value) {return value.toInt() * 2;});qDebug() << "Mapped List: " << mapped;// 81. 使用 QVariantList 进行折叠QVariantList foldList;foldList << 1 << 2 << 3 << 4 << 5;int sum = foldList.fold(0, [](int accumulator, const QVariant& value) {return accumulator + value.toInt();});qDebug() << "Folded Sum: " << sum;// 82. 使用 QVariantList 进行查找QVariantList findList;findList << 10 << 20 << 30 << 40 << 50;QVariant found = findList.find([](const QVariant& value) {return value.toInt() == 30;});qDebug() << "Found Value: " << found;// 83. 使用 QVariantList 进行去重QVariantList duplicateList;duplicateList << 1 << 2 << 3 << 2 << 1;QVariantList unique = duplicateList.unique();qDebug() << "Unique List: " << unique;// 84. 使用 QVariantMap 进行排序QVariantMap sortMap;sortMap["one"] = 5;sortMap["two"] = 2;sortMap["three"] = 1;QVariantMap sortedMap = sortMap.sortedKeys();qDebug() << "Sorted Map: " << sortedMap;// 85. 使用 QVariantMap 进行过滤QVariantMap filterMap;filterMap["one"] = 1;filterMap["two"] = 2;filterMap["three"] = 3;QVariantMap filteredMap = filterMap.filter([](const QVariant& key, const QVariant& value) {return value.toInt() % 2 == 0;});qDebug() << "Filtered Map: " << filteredMap;// 86. 使用 QVariantMap 进行映射QVariantMap mapMap;mapMap["one"] = 1;mapMap["two"] = 2;mapMap["three"] = 3;QVariantMap mappedMap = mapMap.map([](const QVariant& key, const QVariant& value) {return QVariant(key.toString() + "Squared", value.toInt() * value.toInt());});qDebug() << "Mapped Map: " << mappedMap;// 87. 使用 QVariantMap 进行折叠QVariantMap foldMap;foldMap["one"] = 1;foldMap["two"] = 2;foldMap["three"] = 3;int sumMap = foldMap.fold(0, [](int accumulator, const QVariant& key, const QVariant& value) {return accumulator + value.toInt();});qDebug() << "Folded Sum in Map: " << sumMap;return a.exec();
}

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

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

相关文章

JVM离线分析-使用MAT分析dump堆文件

1. MAT&#xff08;Memory Analyzer Tool&#xff09;的介绍 官方介绍 The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption. Use the Memory Analyzer to analyze productive heap …

Java随机获取某个范围内的随机整数

随机获取某个范围内的随机整数 一、代码 /*** 随机获取某个范围内的随机整数的值* param min 最小值* param max 最大值* return*/public static int randomNum(int min,int max) {// 创建一个Random对象Random random new Random();// 生成指定范围内的随机整数int randomI…

通过@ConfigrationProperties读取配置文件属性并赋值

这种设计使得 Anything 成为 Something 类的静态成员&#xff0c;因此不依赖于外部类的实例。静态内部类通常更独立&#xff0c;它们可以单独存在且无需引用外部类的实例。 如果将 Anything 类定义为非静态的内部类&#xff0c;它将依赖于 Something 类的实例。这意味着每个 S…

牛客周赛 Round 17

A、 题目描述&#xff1a; 游游拿到了一个边长为n的正方形披萨&#xff0c;她准备切k刀&#xff08;每刀只能横着或竖着切开&#xff09;&#xff0c;最终会形成若干个小矩形披萨。游游希望每个小披萨的面积相等&#xff0c;且矩形的长和宽的差的绝对值尽可能小。你能帮游游求出…

vue中的rules表单校验规则使用方法 :rules=“rules“

一、el-form里面必写属性值 :ref"dataForm" // 提交表单时进行校验 :rules"rules" // return 下的校验规则 :model"userForm" // 绑定表单的值 <el-formref"dataForm" // 必写属性值:rules"rules"…

CV论文阅读大合集

YearNameAreamodeldescriptiondrawback2021 ICMLClip &#xff08;Contrastive Language-Image Pre-training&#xff09;contrastive learning、zero-shot learing、mutimodel用文本作为监督信号来训练可迁移的视觉模型CLIP’s zero-shot performance, although comparable to…

Eureka处理流程

1、Eureka Server服务端会做什么 1、服务注册 Client服务提供者可以向Server注册服务&#xff0c;并且内部有二层缓存机制来维护整个注册表&#xff0c;注册表是Eureka Client的服务提供者注册进来的。 2、提供注册表 服务消费者用来获取注册表 3、同步状态 通过注册、心跳机制…

海康多相机同步取流保存图片

话不多说&#xff0c;直接上代码。代码里包含了多窗口显示图像和保存图片。 #"rtsp://admin:123456qq192.168.10.192/stream1" # rtsp://admin:Admin123192.168.100.103:554/Streaming/Channels/101 #rtsp://admin:Admin123192.168.100.103:554/cam/realmonitor?ch…

redis缓存击穿,redisson分布式锁,redis逻辑过期

什么是缓存击穿&#xff1a; 缓存击穿是指在高并发环境下&#xff0c;某个热点数据的缓存过期&#xff0c;导致大量请求同时访问后端存储系统&#xff0c;引起系统性能下降和后端存储压力过大的现象。 解决方案&#xff1a; 1. redisson分布式锁 本质上是缓存重建的过程中&…

「Verilog学习笔记」四选一多路器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 通过波形示意图我们可以发现&#xff0c;当sel为0&#xff0c;1&#xff0c;2时&#xff0c;输出mux_out分别为d3&#xff0c;d2&#xff0c;d1&#xff0c;那么sel3…

PHP中文转拼音实现

pinyin.php 床前明月光&#xff0c;疑是地上霜。 举头望明月&#xff0c;低头思故乡 <?php /*** PHP 汉字转拼音 [包含20902个基本汉字5059生僻字]* author 楼教主(cik520qq.com)* version v1.2* note 请开启 mb_string 扩展*/var_dump(pinyin(床前明月光&#xff0c;疑是…

【Redis】的简介和安装配置(Linux和windows)及操作命令

目录 一、概述 1.介绍 2.特点 二、安配 1. 安装 2. 配置 3. 主机连接 1.Linux连接 2.windows连接 三、命令 1. 字符串(String) 2. 哈希(Hash) 3. 列表&#xff08;List&#xff09; 4. 集合&#xff08;Set&#xff09; 一、概述 1.介绍 Redis是一个开源的、基…

零代码复现-TCGA联合GEO免疫基因结合代谢基因生信套路(二)

零代码复现-TCGA联合GEO免疫基因结合代谢基因生信套路&#xff08;二&#xff09;-关键基因集的获取和生存数据准备 前面的分析中&#xff0c;下载TCGA和GEO的数据&#xff0c;并进行简单的处理&#xff0c;接下来就是相关基因集的获取和整理&#xff0c;为后期聚类和降维做准…

【PyQt学习篇 · ⑥】:QWidget - 事件

文章目录 事件消息显示和关闭事件移动事件调整大小事件鼠标事件进入和离开事件鼠标按下和释放事件鼠标双击事件鼠标按下移动事件 键盘事件焦点事件拖拽事件绘制事件改变事件右键菜单输入法 事件转发机制案例一案例二案例三 事件消息 显示和关闭事件 showEvent(QShowEvent)方法…

小白如何制作电子画册?看这里,超多画册模板任你挑!

传统纸质版的画册&#xff0c;制作起来即费力又费时&#xff0c;花费还高&#xff0c;想要修改内容还得重新制作&#xff0c;特别麻烦。现在互联网发达&#xff0c;如今已经用上了H5的技术&#xff0c;小白也能快速制作一本翻页电子画册。 只需用FLBOOK&#xff0c;在线就可以制…

git reflog 恢复git reset --hard 回退的内容

首先使用 git reflog 查看处理的历史&#xff0c;历史是由新到旧排列的&#xff0c;找到回退前的commit的id&#xff0c;找的过程可以只关注HEAD的部分&#xff0c;HEAD括号中的值越大越旧&#xff0c;越小越新。 找到后执行以下命令 git reset --hard 你的commit_id 然后…

Linux的历史与环境

目录 Linux的背景介绍 Linux的时代背景-硅谷模式 计算机发展 UNIX发展历史 Linux诞生的偶然与必然 Linux开源 Linux发行版本 搭建Linux的环境 1.直接安装在物理机上 2.使用虚拟机软件 3.使用云服务器 &#xff08;1&#xff09;购买云服务器 &#xff08;2&#x…

OceanBase:03-集群部署

目录 一、集群规划 二、配置要求 三、部署前配置 1.配置 limits.conf 2.配置 sysctl.conf 3.关闭防火墙 4.关闭 SELinux 5.创建数据目录&#xff0c;修改文件所有者信息 6.设置无密码 SSH 登录 7.安装jdk 四、解压执行安装 五、集群部署 1.OBD命令行部署 2. OBD白…

2019年408真题复盘

紫色标记是认为有一定的思维难度或重点总结 红色标记是这次刷真题做错的 记录自己对题目的一些想法与联系&#xff0c;可能并不太关注题目本身。 分数用时 选择部分 80/8036min大题部分41/7094min总分121130min 摘自知乎老哥&#xff1a;“我做历年真题时&#xff0c;绝大部分…

图数据库Neo4j——SpringBoot使用Neo4j 简单增删改查 复杂查询初步

前言 图形数据库是专门用于存储图形数据的数据库&#xff0c;它使用图形模型来存储数据&#xff0c;并且支持复杂的图形查询。常见的图形数据库有Neo4j、OrientDB等。 Neo4j是用Java实现的开源NoSQL图数据库&#xff0c;本篇博客介绍如何在SpringBoot中使用Neo4j图数据库&…