Qt 读取和写入 INI 格式的配置文件
- 前言:INI 配置文件在 Qt 开发中的重要性
- 基础夯实:INI 文件结构与 QSettings 核心概念
- 1. INI 文件的基本结构
- 2. QSettings 类概述
- 3. 初始化 QSettings 对象
- 4. 基本读写操作
- 5. 高级操作技巧
- 5.1 处理数组和列表
- 5.2 检查键是否存在
- 5.3 删除配置项
- 5.4 同步操作
- 实例效果展示:
- 实现功能:
- 核心代码:
前言:INI 配置文件在 Qt 开发中的重要性
在 Qt 应用程序开发中,配置文件是实现用户个性化设置与系统参数持久化的重要工具。INI (Initialization) 格式因其简洁的结构、跨平台兼容性和易于手动编辑的特性,成为存储应用程序配置的理想选择。通过 Qt 提供的QSettings类,开发者可以轻松实现 INI 文件的读写操作,无需关心底层实现细节,从而将更多精力投入到业务逻辑开发中。
本文将详细介绍如何使用 Qt 的QSettings类高效读写 INI 格式配置文件,涵盖基础操作、高级技巧及实际应用场景,帮助你在项目中更好地管理和维护配置信息。
基础夯实:INI 文件结构与 QSettings 核心概念
1. INI 文件的基本结构
INI 文件由三部分组成:
节 (Section):用方括号[]标识,用于分组相关配置项
键值对 (Key-Value):格式为Key=Value,存储具体配置信息
注释:以分号;或井号#开头的行,用于说明配置用途
[General] ; 通用设置节
WindowSize=800x600
FullScreen=false
[Network] ; 网络设置节
ServerAddress=127.0.0.1
Port=8080
[User] ; 用户信息节
Name=John Doe
Email=john@example.com
2. QSettings 类概述
QSettings是 Qt 提供的用于读写配置文件的核心类,支持多种格式:
QSettings::IniFormat - INI 文本格式
QSettings::NativeFormat - 操作系统原生格式 (Windows 注册表 /macOS CFPreferences)
QSettings::JsonFormat - JSON 格式 (Qt 5.15+)
核心优势:
统一的 API 接口,屏蔽底层格式差异
自动处理数据类型转换
支持默认值机制
线程安全设计
支持嵌套分组结构
3. 初始化 QSettings 对象
创建操作 INI 文件的QSettings实例有两种方式:
方式一:全局应用程序范围 (推荐)
// 在main函数中设置应用程序信息
QCoreApplication::setOrganizationName("MyCompany");
QCoreApplication::setApplicationName("MyApp");
// 使用全局设置
QSettings settings(QSettings::IniFormat, QSettings::UserScope, "MyCompany", "MyApp");
// 配置文件将自动保存到系统默认位置(如Windows: %APPDATA%\MyCompany\MyApp.ini)
方式二:指定文件路径
QSettings settings("config.ini", QSettings::IniFormat);
// 配置文件将保存在应用程序同级目录下
4. 基本读写操作
QSettings通过setValue()和value()方法实现配置项的读写:
// 写入配置
settings.setValue("General/WindowSize", "800x600");
settings.setValue("Network/ServerAddress", "127.0.0.1");
settings.setValue("User/LoggedIn", true);
// 读取配置(带默认值)
QString windowSize = settings.value("General/WindowSize", "640x480").toString();
QString server = settings.value("Network/ServerAddress", "localhost").toString();
bool loggedIn = settings.value("User/LoggedIn", false).toBool();
关键特性:
使用/分隔节名和键名,支持嵌套结构
自动类型转换:支持 QString、int、bool、QVariant 等类型
写入操作自动触发文件保存,无需显式调用 save ()
5. 高级操作技巧
5.1 处理数组和列表
// 写入数组
settings.beginWriteArray("RecentFiles");
for (int i = 0; i < files.size(); ++i) {
settings.setArrayIndex(i);
settings.setValue("filePath", files[i]);
}
settings.endArray();
// 读取数组
int size = settings.beginReadArray("RecentFiles");
for (int i = 0; i < size; ++i) {
settings.setArrayIndex(i);
QString filePath = settings.value("filePath").toString();
// 处理文件路径
}
settings.endArray();
5.2 检查键是否存在
if (settings.contains("User/Email")) {
// 存在则读取
QString email = settings.value("User/Email").toString();
}
5.3 删除配置项
// 删除单个键
settings.remove("User/Email");
// 删除整个节
settings.remove("Network");
5.4 同步操作
通常无需手动调用,但在需要确保数据立即写入磁盘时使用:
settings.sync();
实例效果展示:
ini文件被创建
配置文件内容初始化文件内容一致。
实现功能:
实现在用户登录时,ini文件为空时的创建,如果ini文件存在,则根据用户的操作进行读取和写入。之前是使用数据库实现用户的登录和忘记密码操作的。但是有时候使用ini文件操作会更加简单,可以替换数据库的操作。
核心代码:
// 创建默认配置文件
void loginPage::createDefaultConfig()
{
QSettings settings(filePathStr, QSettings::IniFormat);
// 设置默认值
settings.setValue("Login/lockPassword", false);
settings.setValue("Login/autoLogin", false);
settings.setValue("Login/password", "123456"); // 密码使用字符串格式存储
settings.setValue("Login/hospitalName", "医院");
qDebug() << "创建默认配置文件,初始密码: 123456";
}
// 读取配置文件
void loginPage::readSettings()
{
QSettings settings(filePathStr, QSettings::IniFormat);
// 读取配置
lockPassword = settings.value("Login/lockPassword", false).toBool();
autoLoginFlag = settings.value("Login/autoLogin", false).toBool();
passwordStr = settings.value("Login/password", "").toString();
hospitalName = settings.value("Login/hospitalName", "").toString();
// 更新UI状态
ui->checkBoxLockPassword->setChecked(lockPassword);
ui->checkBoxAutoLogin->setChecked(autoLoginFlag);
// 如果记住密码,填充密码
if (lockPassword) {
ui->editPassword->setText(passwordStr);
}
}
// 写入配置文件
void loginPage::writeSettings()
{
QSettings settings(filePathStr, QSettings::IniFormat);
// 写入配置
settings.setValue("Login/lockPassword", lockPassword);
settings.setValue("Login/autoLogin", autoLoginFlag);
settings.setValue("Login/password", passwordStr);
settings.setValue("Login/hospitalName", hospitalName);
}