QSettings读写注册表、配置文件

2024-04-12 03:08

本文主要是介绍QSettings读写注册表、配置文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简述

一般情况下,我们在开发软件过程中,都会缓存一些信息到本地,可以使用轻量级数据库sqlite,也可以操作注册表、读写配置文件。

关于QSettings的使用前面已经介绍过了,比较详细,见“更多参考”,下面介绍下QSettings常用功能-读写注册表、配置文件。

  • 简述
  • 优点
  • 读写注册表
    • 一般存储
    • 一般读取
    • 分目录存储
      • 替换applicationName
      • 分组
  • 读写配置文件
    • 一般存储
    • 一般读取
    • 分组存储
    • 分组读取
    • 分目录存储
  • 删除内容
  • 疑问解释
  • 更多参考

优点

无需指定注册表路径

一般情况下,我们需要定义一个宏,或者常量字符串来指定保存的注册表位置。

  • #define HKEY_CURRENT_USER_QT "HKEY_CURRENT_USER\\SoftWare\\Digia\\Qt"
  • const QString HKEY_CURRENT_USER_QT = "HKEY_CURRENT_USER\\SoftWare\\Digia\\Qt";

无需指定配置文件路径

一般情况下,我们需要定义一个宏,或者常量字符串来指定保存的配置文件位置及名称。

  • #define INI_QT "C:\Users\WangLiang\AppData\Roaming\Digia"
  • const QString INI_QT = "C:\Users\WangLiang\AppData\Roaming\Digia";

采用下面方式,我们不需要做太多工作,Qt已经很好的替你实现了!

读写注册表

一般存储

下面我们以Qt为例,众所周知现在Qt已经属于Digia,也就是说:组织名为Digia,产品名为Qt。

在main()函数中,首先设置组织名、产品名。

QCoreApplication::setOrganizationName(QString("Digia"));
QCoreApplication::setApplicationName(QString("Qt"));
  • 1
  • 2

然后使用QSettings对注册表进行操作:

QSettings settings(QSettings::NativeFormat, QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName());settings.setValue("Name", "Qt Creator");
settings.setValue("Version", 5);
  • 1
  • 2
  • 3
  • 4

这时,我们打开注册表regedit,数据就生成了。

这里写图片描述

一般读取

存储完数据之后,默认的程序启动时需要加载对应的数据。

QString strName = settings.value("Name").toString();
int nVersion = settings.value("Version").toInt();
//Name:Qt Creator  Version:5
  • 1
  • 2
  • 3

这时,我们可以通过查看应用程序输出窗口得到输出结果。

分目录存储

如果我们需要在同一路径下建立多个子目录该怎么办,下面介绍两种方式。

替换applicationName

如上,我们可以看出,organizationName对应的注册表路径为HKEY_CURRENT_USER\\SoftWare\\Digia,applicationName对应的为其下一级的目录,那么分目录就需要更改其对应的applicationName。

QSettings settings(QSettings::NativeFormat, QSettings::UserScope, QString("%1\\%2").arg(QCoreApplication::organizationName()).arg(QCoreApplication::applicationName()), "Qt5.5");settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.5");QSettings settings2(QString("%1\\%2").arg(QCoreApplication::organizationName()).arg(QCoreApplication::applicationName()), "Qt5.6");settings2.setValue("Name", "Qt Creator");
settings2.setValue("Version", "5.6");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

分组

替换applicationName的方式看起来有些繁琐,相比之下,使用group分组则会更简单!

QSettings settings;
settings.beginGroup("Qt5.5");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.5");
settings.endGroup();settings.beginGroup("Qt5.6");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.6");
settings.endGroup();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这时,我们再次查看注册表数据。

注:
新建目录,则需要重新打开注册表,如果新添加设置,则不需要重新打开注册表,只需要来回切换对应的选项即可。

这里写图片描述

读写配置文件

一般存储

如上,我们只需要将格式从NativeFormat变为IniFormat即可:

QSettings settings(QSettings::IniFormat, QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName());settings.setValue("Name", "Qt Creator");
settings.setValue("Version", 5);
  • 1
  • 2
  • 3
  • 4

这时,我们打开对应的存储目录,数据就生成了。

我们可以进入文件夹:C:\Users\WangLiang\AppData\Roaming(AppData默认为隐藏文件,需要设置显示才可查看),可以看到生成了文件夹”Digia”以及配置文件”Qt.ini”。

这里写图片描述

一般读取

存储完数据之后,默认的程序启动时需要加载对应的数据。

QString strName = settings.value("Name").toString();
int nVersion = settings.value("Version").toInt();
//Name:Qt Creator  Version:5
  • 1
  • 2
  • 3

这时,我们可以通过查看应用程序输出窗口得到输出结果。

分组存储

我们可以看到配置文件中包含默认的分组为:General。通常情况下,我们需要对配置进行归类,例如:用户名、密码等信息属于用户组,产品名称、版本号属于设置组。

QSettings settings(QSettings::IniFormat, QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName());settings.beginGroup("Setting");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", 5);
settings.endGroup();settings.beginGroup("User");
settings.setValue("UserName", "WangL");
settings.setValue("Password", "123456");
settings.endGroup();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这时我们再次查看配置文件,里面已经生成了另外两个分组。

这里写图片描述

分组读取

settings.beginGroup("Setting");
QString strName = settings.value("Name").toString();
int nVersion = settings.value("Version").toInt();
settings.endGroup();
//Name:Qt Creator  Version:5settings.beginGroup("User");
QString strUserName = settings.value("UserName").toString();
QString strPassword = settings.value("Password").toString();
settings.endGroup();
//UserName:WangL  Password:123456
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

分目录存储

什么时候需要分目录存储呢?QQ大家都用过吧,是不是每一个用户都有一个对应QQ号的目录呢,里面保存各个用户对应的信息。

如上,我们可以看出,organizationName对应的本地路径为C:\Users\WangLiang\AppData\Roaming\Digia,applicationName对应的为其下的配置文件,那么如果我们需要在同一路径下建立多个目录就需要更改对应的organizationName,配置文件名称则需要更改其对应的applicationName了。

QSettings settings(QSettings::IniFormat, QSettings::UserScope, QString("%1\\%2\\%3").arg(QCoreApplication::organizationName()).arg(QCoreApplication::applicationName()).arg("Qt5.5"), "User");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.5");QSettings settings2(QSettings::IniFormat, QSettings::UserScope, QString("%1\\%2\\%3").arg(QCoreApplication::organizationName()).arg(QCoreApplication::applicationName()).arg("Qt5.5"), "User");
settings2.setValue("Name", "Qt Creator");
settings2.setValue("Version", "5.6");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这时,我们再次查看本地文件,则会发现C:\Users\WangLiang\AppData\Roaming\Digia\Qt所在目录下会生成两个文件夹”Qt5.5”和”Qt5.6”,并且每一个目录底下会生成对应的配置文件User.ini。

这里写图片描述

这里写图片描述

删除内容

删除一个指定的键

QSettings settings;
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", 5);settings.remove("Name");QStringList keys = settings.allKeys();
// keys: ["Version"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

清空所有键

settings.clear(); 
QStringList keys = settings.allKeys();
// keys: []
  • 1
  • 2
  • 3

删除设置键以及子设置键

QSettings settings;
settings.setValue("Qt5.6", "5.6");settings.beginGroup("Qt5.5");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.5");
settings.endGroup();settings.beginGroup("Qt5.6");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.6");
settings.endGroup();settings.remove("Qt5.6");QStringList strList = settings.allKeys();
// keys: ["Qt5.5/Name", "Qt5.5/Version"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

如果key为空字符串,在当前group()的所有键将被删除。

QSettings settings;
settings.setValue("Qt5.6", "5.6");settings.beginGroup("Qt5.5");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.5");
settings.endGroup();settings.beginGroup("Qt5.6");
settings.setValue("Name", "Qt Creator");
settings.setValue("Version", "5.6");
settings.endGroup();settings.beginGroup("Qt5.6");
settings.remove("");
settings.endGroup();QStringList keys = settings.allKeys();
// keys: ["Qt5.5/Name", "Qt5.5/Version"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

疑问解释

如上文代码,我们可以知道未删除之前keys: ["Qt5.6", "Qt5.5/Name", "Qt5.5/Version", "Qt5.6/Name", "Qt5.6/Version"],其中Qt5.6所在分组为默认的General。

这里写图片描述

那么调用下面代码:

settings.beginGroup("Qt5.6");
settings.remove("");
settings.endGroup();
  • 1
  • 2
  • 3

应该只删除对应组中的所有键才对,也就是说剩余的keys应该为 ["Qt5.6", "Qt5.5/Name", "Qt5.5/Version"],General下的键为什么会被删除呢?好,这里先跳过,继续。

General下的键既然可以被删除,那么在Qt5.5分组下建立对应的Qt5.6键值,应该也会被删除。

删除前:

这里写图片描述

删除后:

这里写图片描述

什么鬼,为嘛Qt5.5分组下的Qt5.6对应的键还在呢?

我们继续分析:

删除前:keys: ["Qt5.6", "Qt5.5/Qt5.6", "Qt5.5/Name", "Qt5.5/Version", "Qt5.6/Name", "Qt5.6/Version"]

助手中关于remove()的说明为:Removes the setting key and any sub-settings of key.

也就是说:Qt5.5/Qt5.6键中即使存在Qt5.6,但是所属的setting key为Qt5.5而非Qt5.6,所以不会被删掉。

既然这样,那么我们的疑问也就不复存在了。

这篇关于QSettings读写注册表、配置文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/895932

相关文章

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

ShardingSphere之读写分离方式

《ShardingSphere之读写分离方式》:本文主要介绍ShardingSphere之读写分离方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录ShardingSphere-读写分离读写分离mysql主从集群创建 user 表主节点执行见表语句项目代码读写分

SpringBoot实现多环境配置文件切换

《SpringBoot实现多环境配置文件切换》这篇文章主要为大家详细介绍了如何使用SpringBoot实现多环境配置文件切换功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 示例代码结构2. pom文件3. application文件4. application-dev文

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

springboot实现配置文件关键信息加解密

《springboot实现配置文件关键信息加解密》在项目配置文件中常常会配置如数据库连接信息,redis连接信息等,连接密码明文配置在配置文件中会很不安全,所以本文就来聊聊如何使用springboot... 目录前言方案实践1、第一种方案2、第二种方案前言在项目配置文件中常常会配置如数据库连接信息、Red

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap