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();

结果:

相关推荐
Shadow(⊙o⊙)几秒前
Shell进程替换,自定义Shell解释器——字符串库函数灵活操作!
linux·运维·服务器·开发语言·c++·学习
数智工坊11 分钟前
PyCharm 运行 Python 脚本总自动进 Test 模式?附 RT-DETRv2 依赖缺失终极排坑
开发语言·ide·人工智能·python·pycharm
再写一行代码就下班13 分钟前
根据给定word模板,动态填充指定内容,并输出为新的word文档。(${aa}占位符方式且支持循环动态表格)
java·开发语言
七夜zippoe13 分钟前
DolphinDB流数据表:创建与订阅
开发语言·订阅··dolphindb·数据表
Hua-Jay20 分钟前
OpenCV联合C++/Qt 学习笔记(二十三)----图像校正及单目位姿估计
c++·笔记·qt·opencv·学习·计算机视觉
彦为君30 分钟前
JavaSE-05-字符串(全面深入)
java·开发语言·python·ai·ai编程
charlie11451419141 分钟前
现代C++特性指南(4)——完美转发与移动语义实战
开发语言·c++·现代c++
kels88991 小时前
实时外汇api的节假日交易时间表,能自动判断休市吗?
开发语言·经验分享·笔记·python·金融·区块链
布吉岛的石头1 小时前
Java 程序员第 29 阶段-01:大模型微调入门:小样本业务适配方案
java·开发语言·人工智能
高林雨露1 小时前
Java 转 Kotlin 对照开发指南
java·开发语言·kotlin