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

结果:

相关推荐
多喝开水少熬夜6 小时前
Trie树相关算法题java实现
java·开发语言·算法
QT 小鲜肉6 小时前
【QT/C++】Qt定时器QTimer类的实现方法详解(超详细)
开发语言·数据库·c++·笔记·qt·学习
MeowKnight9586 小时前
【Qt】Qt实践记录3——UDP通信
笔记·qt
lsx2024066 小时前
MySQL WHERE 子句详解
开发语言
Tony Bai6 小时前
【Go模块构建与依赖管理】09 企业级实践:私有仓库与私有 Proxy
开发语言·后端·golang
Lucky小小吴6 小时前
开源项目5——Go版本快速管理工具
开发语言·golang·开源
Mr.Jessy7 小时前
Web APIs 学习第五天:日期对象与DOM节点
开发语言·前端·javascript·学习·html
杨福瑞7 小时前
数据结构:单链表(2)
c语言·开发语言·数据结构
进化中的码农7 小时前
Go中的泛型编程和reflect(反射)
开发语言·笔记·golang
音符犹如代码7 小时前
Java并发List实战:CopyOnWriteArrayList原理与ArrayList常见面试题
java·开发语言·面试·list