一、绪论
这里仅介绍三者作为配置文件时的用法,他们还有其他很多功能。
三种配置格式对比
特性 | INI | JSON | XML |
---|---|---|---|
复杂度 | ⭐☆☆☆☆ | ⭐⭐⭐☆☆ | ⭐⭐⭐⭐⭐ |
可读性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐☆ | ⭐⭐⭐☆☆ |
结构支持 | 扁平键值对 | 对象、数组嵌套 | 树形结构、属性 |
Qt支持 | QSettings |
QJsonDocument |
QDomDocument |
适用场景 | 简单配置、用户偏好 | Web应用、API配置 | 企业应用、文档结构 |
文件大小 | 小 | 中等 | 大 |
💡 选择建议
-
INI:简单配置、用户设置、快速原型
-
JSON:Web应用、前后端配置、复杂数据结构
-
XML:企业系统、文档配置、需要严格验证的场景
一句话总结:INI够简单,JSON够灵活,XML够强大!
二、案例
**2.1.**INI
INI文件在实际开发中主要作为轻量级配置文件,用于存储应用程序的各种设置和参数。
INI文件在实际开发中的作用:
-
🎛️ 参数调优 - 快速调整应用行为
-
👤 个性化 - 保存用户偏好设置
-
🔧 环境配置 - 不同环境不同配置
-
📝 状态记忆 - 记住应用上次状态
-
🚀 快速部署 - 修改配置无需重新编译
总结: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();
结果:
