QSettings遍历ini的key

news/2026/1/22 18:24:30/文章来源:https://www.cnblogs.com/tingtaishou/p/19518600

以下是使用 QSettings 遍历 INI 文件所有 key 的几种方法:

方法1:遍历所有顶级 key

#include <QSettings>
#include <QDebug>// 遍历顶级 key
void iterateTopLevelKeys() {QSettings settings("config.ini", QSettings::IniFormat);QStringList keys = settings.allKeys();qDebug() << "All keys (" << keys.size() << "):";for (const QString &key : keys) {QVariant value = settings.value(key);qDebug() << key << "=" << value;}
}

方法2:分组遍历(按 section/group)

void iterateByGroups() {QSettings settings("config.ini", QSettings::IniFormat);// 获取所有组QStringList groups = settings.childGroups();for (const QString &group : groups) {settings.beginGroup(group);qDebug() << "[" << group << "]";// 获取当前组的所有 keyQStringList keys = settings.childKeys();for (const QString &key : keys) {QVariant value = settings.value(key);qDebug() << "  " << key << "=" << value;}settings.endGroup();}
}

方法3:递归遍历(包含嵌套组)

void iterateRecursively(const QString &parentGroup = "") {QSettings settings("config.ini", QSettings::IniFormat);if (!parentGroup.isEmpty()) {settings.beginGroup(parentGroup);}// 遍历当前组的 keyQStringList keys = settings.childKeys();for (const QString &key : keys) {QString fullKey = parentGroup.isEmpty() ? key : parentGroup + "/" + key;QVariant value = settings.value(key);qDebug() << fullKey << "=" << value;}// 递归遍历子组QStringList groups = settings.childGroups();for (const QString &group : groups) {QString newParent = parentGroup.isEmpty() ? group : parentGroup + "/" + group;iterateRecursively(newParent);}if (!parentGroup.isEmpty()) {settings.endGroup();}
}

方法4:遍历特定类型的值

void iterateWithType() {QSettings settings("config.ini", QSettings::IniFormat);QStringList keys = settings.allKeys();for (const QString &key : keys) {QVariant value = settings.value(key);qDebug() << "Key:" << key;qDebug() << "  Type:" << value.typeName();qDebug() << "  Value:" << value;// 根据类型处理if (value.type() == QVariant::String) {qDebug() << "  String value:" << value.toString();} else if (value.type() == QVariant::Int) {qDebug() << "  Int value:" << value.toInt();} else if (value.type() == QVariant::Bool) {qDebug() << "  Bool value:" << value.toBool();}qDebug() << "---";}
}

方法5:使用迭代器模式

void iterateWithSync() {QSettings settings("config.ini", QSettings::IniFormat);// 确保读取最新数据settings.sync();const QStringList keys = settings.allKeys();// 使用 QList 迭代器for (auto it = keys.constBegin(); it != keys.constEnd(); ++it) {const QString &key = *it;qDebug() << key << "->" << settings.value(key);}
}

方法6:处理数组(带数字下标的键)

void iterateArrayKeys() {QSettings settings("config.ini", QSettings::IniFormat);QStringList keys = settings.allKeys();// 过滤出数组形式的键QRegularExpression arrayPattern("\\[\\d+\\]$");for (const QString &key : keys) {if (key.contains(arrayPattern)) {qDebug() << "Array key found:" << key;qDebug() << "Value:" << settings.value(key);}}
}

完整示例程序

#include <QCoreApplication>
#include <QSettings>
#include <QDebug>
#include <QFile>int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 创建示例 INI 文件QSettings settings("example.ini", QSettings::IniFormat);// 写入测试数据settings.setValue("general/app_name", "MyApp");settings.setValue("general/version", "1.0.0");settings.setValue("database/host", "localhost");settings.setValue("database/port", 3306);settings.setValue("database/enabled", true);settings.setValue("window/x", 100);settings.setValue("window/y", 200);settings.sync(); // 确保写入文件// 方法1:遍历所有 keyqDebug() << "=== 方法1:所有键 ===";QStringList allKeys = settings.allKeys();for (const QString &key : allKeys) {qDebug() << key << ":" << settings.value(key);}// 方法2:分组遍历qDebug() << "\n=== 方法2:分组遍历 ===";QStringList groups = settings.childGroups();for (const QString &group : groups) {qDebug() << "\n[" << group << "]";settings.beginGroup(group);QStringList childKeys = settings.childKeys();for (const QString &key : childKeys) {qDebug() << "  " << key << ":" << settings.value(key);}settings.endGroup();}// 清理QFile::remove("example.ini");return 0;
}

注意事项

  1. 路径问题

    • 相对路径相对于当前工作目录
    • 使用绝对路径避免歧义
  2. 性能考虑

    • allKeys() 会加载所有键到内存
    • 对于大文件,考虑分组遍历
  3. 编码问题

    • INI 文件默认使用 UTF-8
    • 确保文件编码正确
  4. 线程安全

    • QSettings 不是线程安全的
    • 多线程访问需要加锁
  5. 实时更新

    settings.sync(); // 刷新缓存,读取最新数据
    

输出示例

假设 INI 文件内容:

[general]
app_name=MyApp
version=1.0.0[database]
host=localhost
port=3306
enabled=true

输出结果:

=== 方法1:所有键 ===
general/app_name : "MyApp"
general/version : "1.0.0"
database/host : "localhost"
database/port : 3306
database/enabled : true=== 方法2:分组遍历 ===[general]app_name : "MyApp"version : "1.0.0"[database]host : "localhost"port : 3306enabled : true

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

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

相关文章

题解:P9194 [USACO23OPEN] Triples of Cows P

更差的阅读体验我们发现一棵树删掉一个点之后会在删掉点的位置形成一个团,这很坏。我们希望还能形成一棵树。 所以我们考虑对这个图建圆方树。 我们以 \(n\) 为根,这样这个点不会被删掉。然后假设方点 \(u\) 的儿子个…

Node.js 后端架构的“隐秘角落”:从 Fastify 引擎到类型系统的博弈

在构建高性能 Node.js 服务&#xff08;尤其是基于 NestJS&#xff09;时&#xff0c;我们往往会遇到一些反直觉的现象&#xff1a;明明名字一样的类型却报错、明明配置了上传却收不到文件、明明锁定了版本却还要担心依赖树。本文将带你深入后端开发的“隐秘角落”&#xff0c;…

java_ssm42基于Java的服装穿搭信息管理系统的设计与实现_idea项目源码

目录具体实现截图项目背景与意义技术架构与功能模块创新点与优势应用价值系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 项目背景与意义 随着时尚产业数字化发展&#xff0c;服装穿搭信息管理系…

学生心理健康测评系统任务书

学生心理健康测评系统任务书 一、任务名称 学生心理健康测评系统开发与落地实施 二、任务背景与目的 当前学生群体面临学业、社交、家庭等多重压力&#xff0c;心理健康问题频发&#xff0c;亟需建立科学、高效的测评与干预机制。传统测评依赖纸质问卷、人工统计&#xff0c;存…

tick 数据接入实战:从 tick 行情到系统节奏感

在真正把 tick 数据 接进系统之前&#xff0c;很多人对它的认知都停留在“最小粒度行情”这几个字上。 但当程序跑起来&#xff0c;WebSocket 连上&#xff0c;日志开始滚动时&#xff0c;第一感受往往不是“数据”&#xff0c;而是节奏。 时间戳在跳&#xff0c;价格在抖&…

AI 搜索话语权争夺战,上海geo优化公司排名盘点,源级引擎成企业战略首选

在生成式 AI 重构信息传播规则的今天,GEO(生成式引擎优化)已从可选的营销技术,升级为企业抢占 AI 生态话语权的核心战略资产。上海作为中国数字经济的前沿阵地,2025 年企业在 AI 营销技术领域的投入规模已达 215 …

“新”意十足 · HarmonyOS模板组件(本次上新:求职、回收、旅游攻略模板;发票、估价等组件)

&#x1f4a1; 鸿蒙生态为开发者提供海量的HarmonyOS模板/组件&#xff0c;助力开发效率原地起飞 &#x1f4a1; ★ 更多内容&#xff0c;一键直达生态市场组件&模板市场 , 快速应用DevEco Studio插件市场集成组件&模板 ★ ★ 一键直达 HarmonyOS 行业解决方案 ★ 模…

芜湖抖音巨量广告+巨量本地推开户投流攻略:认准三十六行网络科技,全案运营助力精准获客

芜湖作为长三角经济发展的重要节点,互联网营销需求持续攀升。对于想要借助抖音平台实现品牌推广与精准获客的企业而言,选择一家专业的投流运营公司至关重要。三十六行网络科技 (芜湖分公司),凭借抖音、美团等多平…

java_ssm43健身房管理系统的设计与实现天津大学_idea项目源码

目录 具体实现截图项目背景技术架构核心功能模块创新点与特色应用价值 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 项目背景 随着全民健身意识的提升&#xff0c;健身房管理需求日益复杂&a…

“新”意十足 · HarmonyOS模板组件(功能增强:商城、美食、工具等模板;短视频、剪辑等组件)

&#x1f4a1; 鸿蒙生态为开发者提供海量的HarmonyOS模板/组件&#xff0c;助力开发效率原地起飞&#x1f4a1; ★ 更多内容&#xff0c;一键直达生态市场组件&模板市场 , 快速应用DevEco Studio插件市场集成组件&模板 ★ ★ 一键直达 HarmonyOS 行业解决方案 ★ 模板…

2026控油去屑防脱洗发水排行榜:WMP登顶,精准适配不同需求

引言:《2025中国头皮健康消费报告》指出,国内油头伴头屑人群占比已突破62%,其中25-40岁群体占比超70%;而《2025中国头皮健康消费白皮书》进一步披露,同时受出油、头屑、脱发困扰的用户占比达58%,且76%的用户因选…

java_ssm36在线课堂问答教学系统课件 作业考试_idea项目源码

目录具体实现截图项目概述技术架构核心功能特色设计部署说明适用场景系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 项目概述 Java_SSM36在线课堂问答教学系统基于SSM框架&#xff08;SpringSp…

java_ssm37在线音乐分享平台的设计与实现

目录具体实现截图摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 摘要 在线音乐分享平台基于Java SSM框架&#xff08;Spring、Spring MVC、MyBatis&#xff09;开发&#xff0c;结合MySQL数…

基于Java+SpringBoot+SSM宠物医院管理系统(源码+LW+调试文档+讲解等)/宠物医院管理软件/宠物医院信息管理系统/宠物医院服务平台/宠物医院管理方案/宠物医院运营系统

博主介绍 &#x1f497;博主介绍&#xff1a;✌全栈领域优质创作者&#xff0c;专注于Java、小程序、Python技术领域和计算机毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2025-2026年最新1000个热门Java毕业设计选题…

密封性好的渣浆泵有哪些?三大渣浆泵品牌硬核实力大比拼

在矿山、电力、冶金、环保等高磨损、高腐蚀的严苛工况中,渣浆泵的密封性能直接影响设备运行的稳定性、环境清洁度与综合使用成本。优异的密封技术能有效防止浆体泄漏,减少停机维护,提升生产效率。今天,我们基于技术…

环保的渣浆泵厂家推荐:石泵泵业提供高效和可靠的解决方案

在全球产业向绿色、低碳转型的背景下,环保已不再是一道“选择题”,而是所有工业企业必须面对的“必答题”。尤其在矿山、电力、冶金、疏浚等领域,作为关键输送设备的渣浆泵,其性能与环保表现直接关系到生产线的能耗…

你的细胞在窃听:别给身体发“毒代码”

细胞也在“听”你怎么对待生活 一、 身体从来不是“哑巴” 咱们今天聊点稍微“深”一点的话题。 你有没有过这种感觉&#xff1f;明明没干什么体力活&#xff0c;也没搬砖也没扛包&#xff0c;但就是觉得累。那种累&#xff0c;像是浸在骨头缝里的&#xff0c;睡一觉也缓不过…

国产操作系统主流品牌阵营解析:谁在定义市场?

自中国计算机事业起步以来,国产操作系统的探索便从未停止。真正的转折点,源于开源运动的蓬勃发展和国家信息化安全战略的明晰。 国际开源社区,特别是Linux生态的成熟,为中国操作系统发展提供了极高的起点和肥沃的土…

java_ssm38基于BS架构的家庭理财管理系统的设计与实现_idea项目源码

目录具体实现截图系统背景与意义技术架构与开发环境核心功能模块系统创新点应用价值与总结系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 系统背景与意义 随着互联网技术的发展和家庭经济管理需…

2026年2-3月国际机票最低价查询指南:如何高效锁定未来一个月的价格?

随着2026年春季出行计划的启动,许多旅客开始将目光投向2月和3月的国际机票。如何高效、精准地查询未来一个月内的低价机票,成为规划行程的关键第一步。面对市场上众多的机票查询平台,用户的核心关切在于:哪个平台能…