版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:
本文标题:QSettings配置读写-win注册表操作-ini文件读写     本文地址:http://techieliang.com/2017/12/674/

1. 介绍

官方帮助文档:QSettings

一套完整的配置文件读写机制,多平台支持,支持ini文件读写、win下注册表读写等操作。同时支持当前用户配置及当前系统配置两个作用范围。

2. 创建配置文件

配置文件涉及到作用域(scope)、文件名(filename)、组织名(organization)、程序名(application)、配置格式(format)等,下面是可用的构造函数:

  1. QSettings(const QString &organization, const QString &application = QString(), QObject *parent = Q_NULLPTR) //1
  2. QSettings(Scope scope, const QString &organization, const QString &application = QString(), QObject *parent = Q_NULLPTR) //2
  3. QSettings(Format format, Scope scope, const QString &organization, const QString &application = QString(), QObject *parent = Q_NULLPTR) //3
  4. QSettings(const QString &fileName, Format format, QObject *parent = Q_NULLPTR) //3
  5. QSettings(QObject *parent = Q_NULLPTR)

构造方式1在win下自动在注册表读写,2也一样

3如果设置为ini类型会在”C:/Users/XXXXX/AppData/Roaming/”用户范围建立ini文件,”C:/ProgramData/”系统范围

4可以指定文件名和类型

2.1. 配置格式

Constant Value Description
QSettings::NativeFormat 0 Store the settings using the most appropriate storage format for the platform. On Windows, this means the system registry; on macOS and iOS, this means the CFPreferences API; on Unix, this means textual configuration files in INI format.
QSettings::Registry32Format 2 Windows only: Explicitly access the 32-bit system registry from a 64-bit application running on 64-bit Windows. On 32-bit Windows or from a 32-bit application on 64-bit Windows, this works the same as specifying NativeFormat. This enum value was added in Qt 5.7.
QSettings::Registry64Format 3 Windows only: Explicitly access the 64-bit system registry from a 32-bit application running on 64-bit Windows. On 32-bit Windows or from a 64-bit application on 64-bit Windows, this works the same as specifying NativeFormat. This enum value was added in Qt 5.7.
QSettings::IniFormat 1 Store the settings in INI files.
QSettings::InvalidFormat 16 Special value returned by registerFormat().

2.2. 作用域

QSettings::UserScope 0 Store settings in a location specific to the current user (e.g., in the user’s home directory).
QSettings::SystemScope 1 Store settings in a global location, so that all users on the same machine access the same set of settings.

如果设置作用域为用户,则先检查用户,如果没有再检查系统范围。如果设置为系统则不会检查用户。

2.3. 关于组织、程序名

程序具有全局唯一的组织及程序名,可以直接使用。如果需要单独建立则不需要

  1. QSettings settings("Moose Soft", "Facturo-Pro");//自定义
  2. //配置全局名称并使用
  3. QCoreApplication::setOrganizationName("Moose Soft");
  4. QCoreApplication::setApplicationName("Facturo-Pro");
  5. QSettings settings;//此时可以无参数构造

3. 配置文件读写

读写配置:setValue、value

为了数据的分类明确还提供了配置分组功能,需要使用beginGroupendGroup 注意begin开始后面代码表示在组内操作,若想访问组外内容必须先end

读写时可以不用group操作,通过以下方式也可表示组的概念:

  1. settings.setValue("mainwindow/size", win->size());
  2. settings.setValue("mainwindow/fullScreen", win->isFullScreen());
  3. settings.setValue("outputpanel/visible", panel->isVisible());
  4. //等效于:
  5. settings.beginGroup("mainwindow");
  6. settings.setValue("size", win->size());
  7. settings.setValue("fullScreen", win->isFullScreen());
  8. settings.endGroup();
  9. settings.beginGroup("outputpanel");
  10. settings.setValue("visible", panel->isVisible());
  11. settings.endGroup();

同时支持数组beginReadArray、beginWriteArray、endArray 注意begin开始后面代码表示在组内操作,若想访问组外内容必须先end

除此以外还有remove删除配置内容,注意此删除是完全删除此配置项,不是把当前配置内容制空

在读数据之前可以使用contains判断是否有当前key的配置项

还有具有范围伤害的两个方法:clear删除所有配置项(注册表需要符合组合和程序名,ini就是清空)、allKeys读取当前group及下属所有配置项key的名称

4. 范例

上面的可能看不懂,下面遍历一遍win下的配置格式和作用域

4.1. win下SystemScope、IniFormat

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include <QSettings>
  4. int main(int argc, char *argv[]) {
  5. QCoreApplication a(argc,argv);
  6. QSettings config(QSettings::IniFormat, QSettings::SystemScope,"TechieLiang", "testQSettings");
  7. qDebug()<< config.fileName();
  8. //写入配置文件
  9. config.beginGroup("config");
  10. config.setValue("user_name", "test");
  11. config.setValue("key", 123);
  12. config.endGroup();
  13. config.beginGroup("config");
  14. qDebug()<<config.value("user_name").toString()
  15. <<config.value("key").toInt();
  16. config.beginGroup("config");
  17. return 0;
  18. }
  19. //"C:/ProgramData/TechieLiang/testQSettings.ini"
  20. //"test" 123

4.2. win下UserScope、IniFormat

  1. #include <QCoreApplication>
  2. #include <QDebug>
  3. #include <QSettings>
  4. int main(int argc, char *argv[]) {
  5. QCoreApplication a(argc,argv);
  6. QSettings config(QSettings::IniFormat, QSettings::UserScope,"TechieLiang", "testQSettings");
  7. qDebug()<< config.fileName();
  8. return 0;
  9. }
  10. //"C:/Users/XXXX/AppData/Roaming/TechieLiang/testQSettings.ini"
  11. //XXXX用户名

4.3. win下不设置IniFormat、UserScope

  1. QSettings config(QSettings::UserScope,"TechieLiang", "testQSettings");
  2. qDebug()<< config.fileName();
  3. //"\\HKEY_CURRENT_USER\\Software\\TechieLiang\\testQSettings"

4.4. win下不设置IniFormat、SystemScope

  1. QSettings config(QSettings::SystemScope,"TechieLiang", "testQSettings");
  2. //"\\HKEY_LOCAL_MACHINE\\Software\\TechieLiang\\testQSettings"

4.5. win下InvalidFormat、SystemScope

  1. QSettings config(QSettings::InvalidFormat,QSettings::SystemScope,"TechieLiang", "testQSettings");
  2. //"C:/ProgramData/TechieLiang/testQSettings.ini"

4.6. win下InvalidFormat、UserScope

  1. QSettings config(QSettings::InvalidFormat,QSettings::UserScope,"TechieLiang", "testQSettings");
  2. //"C:/Users/XXXX/AppData/Roaming/TechieLiang/testQSettings.ini"
  3. //XXXX用户名

5. AllKeys

  1. QSettings settings;
  2. settings.setValue("fridge/color", QColor(Qt::white));
  3. settings.setValue("fridge/size", QSize(32, 96));
  4. settings.setValue("sofa", true);
  5. settings.setValue("tv", false);
  6. QStringList keys = settings.allKeys();
  7. // keys: ["fridge/color", "fridge/size", "sofa", "tv"]
  8. settings.beginGroup("fridge");
  9. keys = settings.allKeys();
  10. // keys: ["color", "size"]

6. 高级

6.1. 自定义读写配置方法

registerFormat(const QString &extension, ReadFunc readFunc, WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive)

此方法可以注册自定义格式

  1. bool readXmlFile(QIODevice &device, QSettings::SettingsMap &map);
  2. bool writeXmlFile(QIODevice &device, const QSettings::SettingsMap &map);
  3. int main(int argc, char *argv[])
  4. {
  5. const QSettings::Format XmlFormat =
  6. QSettings::registerFormat("xml", readXmlFile, writeXmlFile);
  7. QSettings settings(XmlFormat, QSettings::UserScope, "MySoft",
  8. "Star Runner");
  9. ...
  10. }

6.2. Win特例

windows下可能一个key同时具有value和子项目,此时值需要通过Default或“.”来访问

On Windows, it is possible for a key to have both a value and subkeys. Its default value is accessed by using “Default” or “.” in place of a subkey:

  1. settings.setValue("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy", "Milkyway");
  2. settings.setValue("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Sun", "OurStar");
  3. settings.value("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Default"); // returns "Milkyway"

6.3. setPath函数-不同模式、范围的默认路径

如果开始设置的范围、配置格式、文件路径不对,也可以通过此函数修改,主要是按默认路径

void QSettings::setPath(Format format, Scope scope, const QString &path)

对应的默认路径如下:

Platform Format Scope Path
Windows IniFormat UserScope FOLDERID_RoamingAppData
SystemScope FOLDERID_ProgramData
Unix NativeFormat, IniFormat UserScope $HOME/.config
SystemScope /etc/xdg
Qt for Embedded Linux NativeFormat, IniFormat UserScope $HOME/Settings
SystemScope /etc/xdg
macOS and iOS IniFormat UserScope $HOME/.config
SystemScope /etc/xdg
转载请以链接形式标明本文标题和地址:Techie亮博客 » QSettings配置读写

转载于:https://www.cnblogs.com/techiel/p/8030054.html

QSettings配置读写-win注册表操作-ini文件读写相关推荐

  1. QSettings 操作注册表 与 ini 文件的优劣

    0.注册表和ini的优劣之处 ini文件最大好处就是 无污染 注册表的最大好处就是 隐密! 总结: (1) 注册表 采用的是二进制形式登录数据,INI 文件采用的则是简单的文本形式登录数据. (2)  ...

  2. Qt读写注册表和ini文件

    转自:http://blog.ednchina.com/frenkie/257019/message.aspx 需要#include <QSettings> 只举几个简单的例子: 1.用Q ...

  3. python中io.textio_Python文件读写概述(IO操作、文件读写、stringiobytesio、序列化),python,的,小,总结,StringIOBytesIO...

    IO操作 在进行文件的读写之前,需要说明几点.首先,运行的程序和读取的数据都会在内存中缓存. 进入到 程序或数据 内存 其次,用python程序进行文件的读写,需要创建一个小工具–文件流,用来处理数据 ...

  4. 查看电脑配置命令_注册表

    查看电脑配置命令 2008年06月16日 星期一 13:59 打开注册表 开始--运行--regedit 什么是注册表? 注册表因为它复杂的结构和没有任何联系的CLSID键使得它可能看上去很神秘.不幸 ...

  5. Delphi 注册表操作

    Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创建和释放TRegistry对象 1.创建TRegistry对象.为了操作注册表,要创建一个TRegistry对象:ARe ...

  6. delphi 注册表操作(读取、添加、删除、修改)完全手册

    32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创建和释放TRegistry对象 1.创建TRegistry对象.为了操作注册表,要创建一个TRegistry对象: ...

  7. delphi 注册表操作之(读取、添加、删除、修改)

    32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创建和释放TRegistry对象 1.创建TRegistry对象.为了操作注册表,要创建一个TRegistry对象: ...

  8. window注册表操作手册

    环境: window 10企业版 .netcore 3.1 vs 2019 16.4.5 控制台程序以管理员身份运行 参照: Windows注册表内容详解 C#操作注册表 一.window注册表简介 ...

  9. Windows核心编程_注册表操作和小练习程序关联

    大家有没有见过就是当我们下载一个软件比如视频播放器 下载之后我们电脑上的视频文件图标都变成了这个视频播放器的图标,然后打开时也是默认调用此视频播放器来播放 下面就给大家介绍如何在Windows平台上实 ...

最新文章

  1. 记录 之 numpy扩充某一维度,并重复填充
  2. LeetCode刷题实战(2):Add Two Numbers
  3. java linux 调用32位so_Linux上TCP的几个内核参数调优
  4. Java性能优化之String字符串优化,BAT 面试官 如何面试
  5. Swift - 实现tableView单选系统样式
  6. Java-多线程第三篇3种创建的线程方式、线程的生命周期、线程控制、线程同步、线程通信...
  7. 西门子FB284伺服v90profinet程序西门子触摸屏程序
  8. 2021年40个最佳免费WordPress主题
  9. 未注册小程序名称-小程序名称大全-周期更新未注册的好名字
  10. selenium+phantomjs截长图踩坑
  11. PHP队列研究一(数据库任务队列)
  12. 虚函数占用类空间大小(转)
  13. 7-5 循环日程表 (10 分)
  14. 树莓派4B安装opencv4【详解】
  15. ETL学习-前期准备
  16. 信息化App在「左」,数字化App在「右」
  17. iOS彻底下架删除应用
  18. 在线教育项目_整体介绍
  19. 英语不好可以学编程嘛?程序员必备英文单词汇总
  20. c语言自学怎么学精,新手自学C语言提高效率的方法(混精)

热门文章

  1. UWA服务模式调整通知
  2. hihocoder#1054之滑动解锁
  3. Python深度学习 魔法函数2
  4. 某某集团信息化建设项目(六)
  5. IDEA创建Tomcat启动配置
  6. [网鼎杯 2020 朱雀组]之phpweb两种不同的解题方式
  7. 国家开放大学-乡村社会学-形考作业2
  8. Ajax 解释Ajax的XML和JSON格式,操作Ajax的几种封装方法【案例+解释】(二)
  9. 一文解析“硬科技、深科技、黑科技”
  10. Python -- jpype JVM的第三方库使用