Qt-配置文件(INI/JSON/XML)

一、绪论

这里仅介绍三者作为配置文件时的用法,他们还有其他很多功能。

三种配置格式对比

特性 INI JSON XML
复杂度 ⭐☆☆☆☆ ⭐⭐⭐☆☆ ⭐⭐⭐⭐⭐
可读性 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐☆ ⭐⭐⭐☆☆
结构支持 扁平键值对 对象、数组嵌套 树形结构、属性
Qt支持 QSettings QJsonDocument QDomDocument
适用场景 简单配置、用户偏好 Web应用、API配置 企业应用、文档结构
文件大小 小 中等 大

💡 选择建议

  • INI:简单配置、用户设置、快速原型

  • JSON:Web应用、前后端配置、复杂数据结构

  • XML:企业系统、文档配置、需要严格验证的场景

一句话总结:INI够简单,JSON够灵活,XML够强大!

二、案例

**2.1.**INI

INI文件在实际开发中主要作为轻量级配置文件,用于存储应用程序的各种设置和参数。

INI文件在实际开发中的作用:

  1. 🎛️ 参数调优 - 快速调整应用行为

  2. 👤 个性化 - 保存用户偏好设置

  3. 🔧 环境配置 - 不同环境不同配置

  4. 📝 状态记忆 - 记住应用上次状态

  5. 🚀 快速部署 - 修改配置无需重新编译

总结:INI文件就是应用程序的"遥控器",让你不用改代码就能控制程序行为!

cpp 复制代码
// ==================== 写入配置 ====================
    QSettings writeSettings("app_config.ini", QSettings::IniFormat);

    // 写入用户设置
    writeSettings.beginGroup("User");
    writeSettings.setValue("name", "张三");
    writeSettings.setValue("age", 25);
    writeSettings.setValue("vip", true);
    writeSettings.endGroup();

    // 写入应用设置
    writeSettings.beginGroup("App");
    writeSettings.setValue("theme", "dark");
    writeSettings.setValue("language", "zh_CN");
    writeSettings.setValue("volume", 80);
    writeSettings.endGroup();

    qDebug() << "配置写入完成";

    // ==================== 读取配置 ====================
    QSettings readSettings("app_config.ini", QSettings::IniFormat);

    // 读取用户设置
    readSettings.beginGroup("User");
    QString name = readSettings.value("name", "未知").toString();
    int age = readSettings.value("age", 0).toInt();
    bool isVip = readSettings.value("vip", false).toBool();
    readSettings.endGroup();

    // 读取应用设置
    readSettings.beginGroup("App");
    QString theme = readSettings.value("theme", "light").toString();
    QString language = readSettings.value("language", "en_US").toString();
    int volume = readSettings.value("volume", 50).toInt();
    readSettings.endGroup();

    // 输出结果
    qDebug() << "用户名:" << name;
    qDebug() << "年龄:" << age;
    qDebug() << "VIP:" << (isVip ? "是" : "否");
    qDebug() << "主题:" << theme;
    qDebug() << "语言:" << language;
    qDebug() << "音量:" << volume;

结果:

2.2.JSON

代码:

cpp 复制代码
// ==================== 写入JSON配置 ====================
    QJsonObject config;

    // 应用信息
    config["app_name"] = "MyApp";
    config["version"] = "2.1.0";

    // 设置
    QJsonObject settings;
    settings["theme"] = "dark";
    settings["language"] = "zh_CN";
    settings["auto_save"] = true;
    config["settings"] = settings;

    // 快捷键数组
    QJsonArray shortcuts;
    QJsonObject shortcut1;
    shortcut1["action"] = "save";
    shortcut1["key"] = "Ctrl+S";
    shortcuts.append(shortcut1);

    QJsonObject shortcut2;
    shortcut2["action"] = "undo";
    shortcut2["key"] = "Ctrl+Z";
    shortcuts.append(shortcut2);

    config["shortcuts"] = shortcuts;

    // 写入文件
    QJsonDocument doc(config);
    QFile file("config.json");
    file.open(QFile::WriteOnly);
    file.write(doc.toJson(QJsonDocument::Indented));
    file.close();

    qDebug() << "JSON配置写入完成";

    // ==================== 读取JSON配置 ====================
    QFile readFile("config.json");
    readFile.open(QFile::ReadOnly);
    QJsonDocument readDoc = QJsonDocument::fromJson(readFile.readAll());
    QJsonObject readConfig = readDoc.object();

    // 读取数据
    QString appName = readConfig["app_name"].toString();
    QString version = readConfig["version"].toString();

    QJsonObject readSettings = readConfig["settings"].toObject();
    QString theme = readSettings["theme"].toString();
    QString language = readSettings["language"].toString();
    bool autoSave = readSettings["auto_save"].toBool();

    // 读取数组
    QJsonArray readShortcuts = readConfig["shortcuts"].toArray();

    // 输出结果
    qDebug() << "应用名称:" << appName;
    qDebug() << "版本:" << version;
    qDebug() << "主题:" << theme;
    qDebug() << "语言:" << language;
    qDebug() << "自动保存:" << autoSave;

    for (const QJsonValue &value : readShortcuts) {
        QJsonObject shortcut = value.toObject();
        qDebug() << "快捷键:" << shortcut["action"].toString()
                 << "->" << shortcut["key"].toString();
    }

结果:

2.3.XML

写入代码:

cpp 复制代码
// ==================== 写入XML配置 ====================
    QFile file("config.xml");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        qDebug() << "无法创建文件:" << file.errorString();
        return;
    }

    QXmlStreamWriter writer(&file);
    writer.setAutoFormatting(true);
    writer.setAutoFormattingIndent(4);

    writer.writeStartDocument();
    writer.writeStartElement("configuration");

    // 应用信息
    writer.writeStartElement("application");
    writer.writeAttribute("name", "MyApp");
    writer.writeAttribute("version", "2.1.0");
    writer.writeEndElement(); // application

    // 设置
    writer.writeStartElement("settings");

    writer.writeStartElement("theme");
    writer.writeAttribute("value", "dark");
    writer.writeEndElement(); // theme

    writer.writeStartElement("language");
    writer.writeAttribute("value", "zh_CN");
    writer.writeEndElement(); // language

    writer.writeEndElement(); // settings
    writer.writeEndElement(); // configuration
    writer.writeEndDocument();

    file.close();
    qDebug() << "XML配置写入完成";

结果:

读取代码:

cpp 复制代码
  // --- 读取XML配置 ---
    QFile readFile("config.xml");
    if (!readFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "无法打开文件:" << readFile.errorString();
        return;
    }

    QXmlStreamReader reader(&readFile);
    QString appName, version, themeValue, languageValue;

    while (!reader.atEnd() && !reader.hasError()) {
        QXmlStreamReader::TokenType token = reader.readNext();

        if (token == QXmlStreamReader::StartElement) {
            QString elementName = reader.name().toString();

            if (elementName == "application") {
                QXmlStreamAttributes attributes = reader.attributes();
                appName = attributes.value("name").toString();
                version = attributes.value("version").toString();
            }
            else if (elementName == "theme") {
                QXmlStreamAttributes attributes = reader.attributes();
                themeValue = attributes.value("value").toString();
            }
            else if (elementName == "language") {
                QXmlStreamAttributes attributes = reader.attributes();
                languageValue = attributes.value("value").toString();
            }
        }
    }

    if (reader.hasError()) {
        qDebug() << "XML解析错误:" << reader.errorString();
    } else {
        qDebug() << "应用名称:" << appName;
        qDebug() << "版本:" << version;
        qDebug() << "主题:" << themeValue;
        qDebug() << "语言:" << languageValue;
    }

    readFile.close();

结果:

相关推荐
听风吹等浪起1 小时前
第26章:ViT+InceptionDW+FocalLoss改进|CT骨折影像二分类完整Pytorch实现(含PyQt5推理GUI)
pytorch·qt·分类
ShineWinsu1 小时前
对于Qt:QRadioButton常见属性以及QButtonGroup的解析
数据库·c++·qt·microsoft·gui·qradiobutton·qbuttongroup
开开心心_Every1 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
chenbingjie_c2 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++
吴卫斌2 小时前
定投ETF实战指南(四):行业/主题ETF——定投的“进攻端“
开发语言·python·股票·量化
超级架构师3 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
叼烟扛炮3 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
LMT流氓兔4 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真4 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
外收内放5 小时前
Python基础语法练习题(75)
开发语言·python·学习