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

结果:

相关推荐
QX_hao1 天前
【Go】--map和struct数据类型
开发语言·后端·golang
你好,我叫C小白1 天前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
Evand J1 天前
【MATLAB例程】基于USBL和DVL的线性回归误差补偿,对USBL和DVL导航数据进行相互补偿,提高定位精度,附代码下载链接
开发语言·matlab·线性回归·水下定位·usbl·dvl
Larry_Yanan1 天前
QML学习笔记(四十二)QML的MessageDialog
c++·笔记·qt·学习·ui
爱喝白开水a1 天前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
Neverfadeaway1 天前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
武子康1 天前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
杰克尼1 天前
JavaWeb_p165部门管理
java·开发语言·前端
一成码农1 天前
JavaSE面向对象(下)
java·开发语言
偶尔的鼠标人1 天前
Avalonia DataGrid 控件的LostFocus事件会多次触发
开发语言·c#