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

QSettings遍历ini的key

以下是使用 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.jsqmd.com/news/285217/

相关文章:

  • Node.js 后端架构的“隐秘角落”:从 Fastify 引擎到类型系统的博弈
  • java_ssm42基于Java的服装穿搭信息管理系统的设计与实现_idea项目源码
  • tick 数据接入实战:从 tick 行情到系统节奏感
  • 学生心理健康测评系统任务书
  • AI 搜索话语权争夺战,上海geo优化公司排名盘点,源级引擎成企业战略首选
  • “新”意十足 · HarmonyOS模板组件(本次上新:求职、回收、旅游攻略模板;发票、估价等组件)
  • 芜湖抖音巨量广告+巨量本地推开户投流攻略:认准三十六行网络科技,全案运营助力精准获客
  • java_ssm43健身房管理系统的设计与实现天津大学_idea项目源码
  • “新”意十足 · HarmonyOS模板组件(功能增强:商城、美食、工具等模板;短视频、剪辑等组件)
  • 2026控油去屑防脱洗发水排行榜:WMP登顶,精准适配不同需求
  • java_ssm36在线课堂问答教学系统课件 作业考试_idea项目源码
  • java_ssm37在线音乐分享平台的设计与实现
  • 基于Java+SpringBoot+SSM宠物医院管理系统(源码+LW+调试文档+讲解等)/宠物医院管理软件/宠物医院信息管理系统/宠物医院服务平台/宠物医院管理方案/宠物医院运营系统
  • 密封性好的渣浆泵有哪些?三大渣浆泵品牌硬核实力大比拼
  • 环保的渣浆泵厂家推荐:石泵泵业提供高效和可靠的解决方案
  • 你的细胞在窃听:别给身体发“毒代码”
  • 国产操作系统主流品牌阵营解析:谁在定义市场?
  • java_ssm38基于BS架构的家庭理财管理系统的设计与实现_idea项目源码
  • 2026年2-3月国际机票最低价查询指南:如何高效锁定未来一个月的价格?
  • PCB加速度传感器在路噪及底盘NVH测试中的应用与型号推荐
  • java_ssm39基于B_S模式的小型房屋租赁系统的房东_t65a9--论文
  • SUM函数深度解析:从基础求和到多条件统计的完美跨越
  • 2026商标转让购买平台实测榜:综合评分9.9分的平台,标源100%可核验
  • 热销榜单:2026年高口碑修补防水涂料厂家推荐,满足各种工程需求
  • Gensors 压力扫描阀应用:燃气轮机燃烧室压差测量的“冗余智慧”
  • java_ssm40基于j2ee的问卷调查系统--论文
  • java_ssm34在线花卉鲜花商城销售系统的带支付_idea项目源码
  • 职场汇报真能决定升职加薪?那些会说话的人,早就赢在了起跑线上
  • java_ssm35在线视频播放网站的设计与实现_idea项目源码
  • 不依赖源码 生成加密 IPA 的工具,对 IPA 进行符号混淆、资源处理