【实习总结】Qt中如何使用QSettings操作.ini配置文件
目录
相关背景
.ini配置文件是什么
QSettings是什么
操作介绍
头文件
构造一个QSettings对象
读取配置值
写入配置值
检查键是否存在
删除键
同步到磁盘
分组操作
获取所有键
获取子键
获取当前分组的所有子分组
相关背景
在Qt中,同样存在用户打开某个界面进行了一些操作,二次打开后,对应界面需要保存着上次的选择,不能又与第一次打开一样都为空的,比如勾选了一些勾选框启用某些服务,在MFC中,我们是通过pugi::xml将配置信息写入xml文件中,而Qt有提供一个QSettings专门来操作这种配置文件,本篇文章是对使用QSettings读取和写入.ini配置文件的一个总结,会介绍一些前置知识,要直接看如何操作以及操作示例的可以根据目录选择自己需要看的内容噢!
.ini配置文件是什么
.ini文件是一种初始化文件,是windows系统中最常见的配置文件格式之一,他使用key-value键值对的格式来存储程序的配置信息和系统参数。
如下就是一个ini配置文件的内容:
[Database]
host=localhost
port=3306
username=root
password=123456
database=myapp
connection_timeout=30
QSettings是什么
QSettings是Qt框架提供的一个配置管理类,专门用于:
- 持久化存储应用程序的配置信息
- 跨会话保持用户的偏好设置
- 统一管理各种类型的配置数据
QSettings的本质就是一个键值对存储系统
/*键(Key) -> 值(Value)*/
"window_width" -> 800
"user_name" -> "张三"
"auto_save" -> true
操作介绍
头文件
#include <QSettings>
构造一个QSettings对象
构造的方式有很多,这里主要介绍使用指定配置文件路径和格式构造:
函数原型:
QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr);
这种方式可以指定具体的配置文件路径和格式:
参数说明:
- fileName :配置文件的完整路径
- format :文件格式,常用的有 QSettings::IniFormat (INI文件)、 QSettings::NativeFormat (系统原生格式)
- parent :父对象(可选)
使用示例:
QString sFilePath = QCoreApplication::applicationDirPath() + "/config.ini";QSettings settings(sFilePath, QSettings::IniFormat);
如果配置文件已存在,会加载其内容到内存中。
备注:
QCoreApplication::applicationDirPath() 是Qt框架中的一个静态方法,用于获取当前应用程序可执行文件所在的目录路径。还有一些其他的方法比如:
函数 | 返回内容 |
---|---|
applicationDirPath() | 应用程序可执行文件所在目录 |
applicationFilePath() | 应用程序可执行文件的完整路径 |
applicationName() | 应用程序名称 |
读取配置值
函数使用示例:
int value = settings.value("key", 123).toInt();
函数介绍:
- "key"参数指定要读取的配置项的键名。
- 123是读取的配置项的默认值,当指定的配置项的键不存在的时候返回这个值。
- .toInt()将读取的QVariant值转换为整数类型,这个根据需要进行转换。
分组读取配置值,在本文后面的介绍分组的时候会介绍哈!
写入配置值
函数使用示例:
settings.setValue("key", 456);
函数介绍:
- "key"是指定要写入的配置名的项的键名
- 456是这个键名对应的值,会被自动转换为QVariant类型
- 如果键已存在,覆盖原有值,不存在,则创建新建
需要注意的是,这个写入只是将键值对保存到内存中的缓存,根据Qt的延迟写入机制,不会立即写入文件,而是在对象销毁时或调用sync()写入。
分组写入配置值,在本文后面的介绍分组的时候会介绍哈!
检查键是否存在
函数使用示例:
if (settings.contains("key")) {// 键存在
}
函数介绍:
- 检查指定的键名是否存在于配置文件中,只在内存中找,不会修改配置文件。
删除键
函数使用示例:
settings.remove("key");
函数介绍:
- 从配置中删除指定的键及其值,首先从加载到内存中的配置文件内容对应的键移除,在对象销毁或调用sync()时进行,如果键不存在,此操作也不会 发生错误,内部有进行判断。
同步到磁盘
函数使用示例:
settings.sync();
函数介绍:
- 强制将目前内存中的所有更改立即写入到磁盘,刷新缓存,确保数据吃就好,返回同步状态,可用于检查是否成功。
分组操作
分组操作一般是需要开始分组和结束分组,形成一个闭环。
如下:
/*开始分组*/
settings.beginGroup("GroupName");/*读取或者写入配置操作*//*结束分组*/
settings.endGroup();
分组可以嵌套,按照后进先出的顺序结束。分组操作就是在.ini文件增加一个[GroupName] 节点,如下[Software]就是一个分组节点:
[Software]
language=chs
AppMode=2
curserver=V-NET(ASEAN)
获取所有键
函数使用示例:
QStringList keys = settings.allKeys();
函数介绍:
- 返回当前分组下所有键的列表,如果在根级别调用,返回所有键(包括所有分组中的键),返回的键名包含完整路径,如 "GroupName/SubGroup/key",也就是会包含它的分组名。
示例:
假设配置文件如下:
[General]
name=John
age=25
[General/Advanced]
debug=true
[Database]
host=localhost
获取所有键的结果如下:
QStringList allKeys = settings.allKeys();
// allKeys 包含:
//["General/name", "General/age", "General/Advanced/debug", "Database/host"]
获取子键
函数使用示例:
QStringList childKeys = settings.childKeys();
函数介绍:
- 返回当前分组下的直接子键,不包含子分组中的键,返回的键名不包含分组前缀。
示例:
// 假设配置文件内容:
// [General]
// name=John
// age=25
// [Database]
// host=localhost
// port=3306// 获取根级别的子键
QStringList rootKeys = settings.childKeys();
// rootKeys 为空,因为根级别没有直接的键,只有分组// 进入 General 分组
settings.beginGroup("General");
QStringList generalKeys = settings.childKeys();
// generalKeys 包含: ["name", "age"]
settings.endGroup();// 进入 Database 分组
settings.beginGroup("Database");
QStringList dbKeys = settings.childKeys();
// dbKeys 包含: ["host", "port"]
settings.endGroup();
获取当前分组的所有子分组
函数如下:
QStringList rootGroups = settings.childGroups();
函数介绍:
- 返回当前分组下的所有直接子分组名称列表。
示例:
QSettings settings("config.ini", QSettings::IniFormat);// 获取根级别的子分组
QStringList rootGroups = settings.childGroups();
// rootGroups 包含: ["General", "Database"]// 假设有嵌套分组:
// [Window]
// width=800
// [Window/Position]
// x=100
// y=200settings.beginGroup("Window");
QStringList windowGroups = settings.childGroups();
// windowGroups 包含: ["Position"]
settings.endGroup();
如上就是关于QSettings对配置文件的相关操作介绍。