当前位置: 首页 > java >正文

【实习总结】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对配置文件的相关操作介绍。

http://www.xdnf.cn/news/15823.html

相关文章:

  • Vue中组件的生命周期
  • 08_Opencv_基本图形绘制
  • Docker实战:使用Docker部署envlinks极简个人导航页
  • 激光雷达和相机在线标定
  • [C/C++安全编程]_[中级]_[如何安全使用循环语句]
  • 语言学校为何成为IT润日路径的制度跳板?签证与迁移结构的工程化拆解
  • 交通出行大前端与 AI 融合:智能导航与出行预测
  • 智能制造——48页毕马威:汽车营销与研发数字化研究【附全文阅读】
  • jxORM--编程指南
  • linux + 宝塔面板 部署 django网站 启动方式:uwsgi 和gunicorn如何选择 ?
  • windows命令提示符cmd使用
  • Django接口自动化平台实现(四)
  • 第 30 场 蓝桥·算法入门赛 题解
  • 制作mac 系统U盘
  • 零基础学习性能测试第一章-为什么会有性能问题
  • 全面解析 JDK 提供的 JVM 诊断与故障处理工具
  • VSCode使用Jupyter完整指南配置机器学习环境
  • 秒赤Haproxy配置算法
  • `TransportService` 是 **Elasticsearch 传输层的“中枢路由器”**
  • SparseTSF:用 1000 个参数进行长序列预测建模
  • RabbitMQ面试精讲 Day 4:Queue属性与消息特性
  • Java拓扑排序:2115 从给定原材料中找到所有可以做出的菜
  • LWJGL教程(2)——游戏循环
  • 网络(HTTP)
  • 【实战1】手写字识别 Pytoch(更新中)
  • 【no vue no bug】 npm : 无法加载文件 D:\software\nodeJS\node22\npm.ps1
  • 嵌入式硬件篇---舵机(示波器)
  • 小架构step系列20:请求和响应的扩展点
  • 解锁Phpenv:轻松搭建PHP集成环境指南
  • 使用“桥接模式“,实现跨平台绘图或多类型消息发送机制