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

结果:

相关推荐
憨憨崽&几秒前
进击大厂:程序员必须修炼的算法“内功”与思维体系
开发语言·数据结构·算法·链表·贪心算法·线性回归·动态规划
毕设源码-邱学长7 分钟前
【开题答辩全过程】以 基于Java的公职备考在线学习系统的设计与实现为例,包含答辩的问题和答案
java·开发语言·学习
二川bro1 小时前
模型部署实战:Python结合ONNX与TensorRT
开发语言·python
联系QQ:276998851 小时前
电化学与冷启动仿真的赝电容计算及GITT扩散系数研究——阻抗分析拟合与全电池电容器性能评估
开发语言
言言的底层世界1 小时前
c++中STL容器及算法等
开发语言·c++·经验分享·笔记
liu****1 小时前
八.函数递归
c语言·开发语言·数据结构·c++·算法
韭菜钟2 小时前
在Qt中使用QuickJS
开发语言·qt
β添砖java2 小时前
python第一阶段第六章python数据容器
开发语言·python
YouEmbedded2 小时前
解码C++基础——从C到C++
开发语言·从c到c++
yong99902 小时前
基于多普勒连续波雷达原理的MATLAB测速程序
开发语言·matlab