一、INI 文件基础介绍
INI 文件是一种轻量级配置文件格式,以人类可读的文本形式存储应用程序的配置信息,广泛用于 Windows、跨平台应用中。其核心结构由三部分组成:
- 节(Section) :用
[ ]包裹,用于分组相关配置项(如代码中的[database]、[notice]); - 键值对(Key-Value) :格式为
key=value,存储具体配置数据(如ip=192.168.12.189); - 注释 :以
;开头,用于说明配置项含义(代码示例中未体现,实际使用可添加)。
INI 文件的优势在于结构简单、读写便捷、跨平台兼容,适合存储数据库连接信息、应用版本、用户偏好等非复杂配置。
二、Qt QSettings 类核心介绍
1. 什么是 QSettings?
QSettings 是 Qt 框架提供的跨平台配置文件读写工具类,无需手动解析文件格式,即可轻松操作 INI、注册表(Windows)、plist(macOS)等配置存储方式。其核心设计目标是:
- 屏蔽不同平台的配置存储差异,实现 "一次编码,多平台兼容";
- 简化配置项的增删改查操作,无需关注文件 IO 细节;
- 支持自动类型转换(如字符串、数字、布尔值之间的自动转换)。
2. 核心特性
| 特性 | 说明 |
|---|---|
| 跨平台支持 | 自动适配 Windows(INI / 注册表)、macOS(plist)、Linux(INI) |
| 格式支持 | 原生支持 INI 格式(QSettings::IniFormat),也支持默认格式 |
| 键值操作 | 通过setValue()写入、value()读取配置,支持层级键(如"database/ip") |
| 自动管理 | 无需手动处理文件打开 / 关闭,析构时自动刷新数据到文件 |
| 类型转换 | 读取时可通过toString()、toInt()等方法直接转换为目标类型 |
3. 关键接口说明
(1)构造函数:创建 QSettings 实例
cpp
// 核心构造函数(INI文件场景)
QSettings::QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr)
fileName:配置文件路径(如代码中的"MySQL.ini",相对路径会生成在应用运行目录);format:文件格式,必须指定QSettings::IniFormat才能生成标准 INI 文件;parent:父对象,用于 Qt 的对象树管理(可选)。
(2)写入配置:setValue()
cpp
void QSettings::setValue(const QString &key, const QVariant &value)
key:配置键,支持层级键 (用/分隔节和键名,如"database/ip"等价于[database]节下的ip键);value:配置值,支持 Qt 的QVariant类型(可直接传入字符串、数字、布尔值等,自动适配存储)。
(3)读取配置:value()
cpp
QVariant QSettings::value(const QString &key, const QVariant &defaultValue = QVariant()) const
key:目标配置键(需与写入时的层级一致,如"database/port");defaultValue:可选参数,当键不存在时返回的默认值;- 返回值:
QVariant类型,需通过toString()、toInt()等方法转换为具体类型。
(4)其他常用接口
| 接口 | 用途 |
|---|---|
contains(const QString &key) |
判断某个配置键是否存在 |
remove(const QString &key) |
删除指定配置键 |
clear() |
清空所有配置项 |
childGroups() |
获取所有节(Section)名称 |
childKeys() |
获取某个节下的所有键名 |
三、代码实战解析(结合示例代码)
1. 写入 INI 文件:WriteIniFiles()
cpp
void WriteIniFile::WriteIniFiles()
{
// 1. 创建QSettings实例,指定INI格式
QSettings *ConfigWriteIniFiles = new QSettings("MySQL.ini", QSettings::IniFormat);
// 2. 写入层级配置(节/键 = 值)
// [database] 节下的配置
ConfigWriteIniFiles->setValue("database/ip", "192.168.12.189");
ConfigWriteIniFiles->setValue("database/port", "3308");
ConfigWriteIniFiles->setValue("database/user", "root");
ConfigWriteIniFiles->setValue("database/password", "123456");
// [notice] 节下的配置
ConfigWriteIniFiles->setValue("notice/version", "5.6");
ConfigWriteIniFiles->setValue("notice/datetime", "2022-10-25 16:27:23");
// 3. 手动删除实例(或通过父对象自动管理),析构时写入文件
delete ConfigWriteIniFiles;
}
生成的 INI 文件内容:
cpp
[database]
ip=192.168.12.189
port=3308
user=root
password=123456
[notice]
version=5.6
datetime=2022-10-25 16:27:23
2. 读取 INI 文件:ReadIniFiles()(注意修正代码 bug)
示例代码中存在一个小错误:读取ip时的键名误写为"/databse/ip"(少了一个a),修正后解析如下:
cpp
void WriteIniFile::ReadIniFiles()
{
// 1. 创建读取实例(与写入时的文件名、格式一致)
QSettings *ConfigReadIniFiles = new QSettings("MySQL.ini", QSettings::IniFormat);
// 2. 读取配置并转换类型(键名需与写入完全一致)
QString strip = ConfigReadIniFiles->value("database/ip").toString(); // 修正:databse → database
QString strport = ConfigReadIniFiles->value("database/port").toString();
QString struser = ConfigReadIniFiles->value("database/user").toString();
QString strpassword = ConfigReadIniFiles->value("database/password").toString();
QString strversion = ConfigReadIniFiles->value("notice/version").toString();
QString strdatetime = ConfigReadIniFiles->value("notice/datetime").toString();
// 3. 输出结果(toUtf8().data() 解决中文乱码问题)
qDebug() << "读取INI配置文件参数选项如下:";
qDebug() << "MySQL数据库IP地址:" << strip.toUtf8().data();
qDebug() << "数据库端口:" << strport.toUtf8().data();
qDebug() << "数据库用户:" << struser.toUtf8().data();
qDebug() << "数据库密码:" << strpassword.toUtf8().data();
qDebug() << "数据库版本:" << strversion.toUtf8().data();
qDebug() << "数据库日期:" << strdatetime.toUtf8().data();
// 4. 释放资源
delete ConfigReadIniFiles;
}
3. 扩展:判断配置键是否存在(ReadIniFilesIsKey()实现)
cpp
void WriteIniFile::ReadIniFilesIsKey()
{
QSettings settings("MySQL.ini", QSettings::IniFormat);
// 判断某个键是否存在
if (settings.contains("database/ip")) {
qDebug() << "database/ip 配置存在,值为:" << settings.value("database/ip").toString();
} else {
qDebug() << "database/ip 配置不存在,使用默认值:127.0.0.1";
QString defaultIp = settings.value("database/ip", "127.0.0.1").toString(); // 不存在时返回默认值
}
// 获取所有节名称
QStringList sections = settings.childGroups();
qDebug() << "所有配置节:" << sections; // 输出:("database", "notice")
// 获取某个节下的所有键
settings.beginGroup("database"); // 进入[database]节
QStringList dbKeys = settings.childKeys();
qDebug() << "database节下的所有键:" << dbKeys; // 输出:("ip", "port", "user", "password")
settings.endGroup(); // 退出节
}
四、使用 QSettings 的注意事项
- 键名大小写敏感 :Qt 5 中 QSettings 的键名默认区分大小写(如
"database/IP"和"database/ip"是两个不同键),需保持读写一致; - 文件路径问题 :相对路径(如
"MySQL.ini")会生成在应用运行目录,建议使用绝对路径(如"D:/config/MySQL.ini")避免路径混乱; - 中文乱码处理 :读取中文时,通过
toUtf8().data()转换为 C 风格字符串,或直接使用qDebug() << str(Qt 5 + 默认支持 UTF-8); - 资源管理 :手动创建的 QSettings 指针需手动
delete,或使用智能指针(QScopedPointer)自动管理,避免内存泄漏; - 默认值设置 :读取时建议指定默认值(如
value("database/port", "3306")),防止键不存在导致空值异常。
五、总结
QSettings 是 Qt 操作 INI 文件的 "利器",无需关注底层文件解析,通过简单的setValue()和value()即可完成配置读写。结合 INI 文件的轻量特性,二者常被用于:
- 存储数据库连接信息、服务器地址、端口号;
- 保存应用的用户偏好(如窗口大小、主题设置);
- 记录应用版本、更新时间等元数据。
掌握 QSettings 的使用,能大幅简化跨平台应用的配置管理逻辑,提升开发效率。