概述
目录
1.概述
2.专业术语说明
3.使用Qt默认方式读写配置
3.1 使用注册表方式
3.1.1 如何写入配置信息
3.1.2 如何读取配置信息
3.1.3 指定用户范围
3.2 使用INI配置文件
3.3 指定文件名或注册表路径的构造函数
3.4 使用程序全局配置的构造函数
4.读写指定文件名的INI
4.1 读取INI文件
4.2 写入配置到INI
4.3 写入对象的数据到INI
5.读写注册表
5.1 读取注册表
5.2 写入注册表
1.概述
QSettings类提供了与平台无关的持久应用程序设置。
用户通常希望应用程序在会话中记住它的设置(窗口大小和位置,选项等)。这些信息通常存储在Windows上的系统注册表中,以及macOS和iOS上的属性列表文件中。在Unix系统上,在缺乏标准的情况下,许多应用程序(包括KDE应用程序)使用INI文本文件。
QSettings是对这些技术的抽象,使您能够以可移植的方式保存和恢复应用程序设置。它还支持自定义存储格式。
QSettings的API基于QVariant,允许您以最少的努力保存大多数基于值的类型,如QString、QRect和QImage。
2.专业术语说明
QSettings对数据的存储方式和用户访问范围作了一些分类,并且专门定义了两个枚举类型来表示。
存储格式(
enum QSettings::Format)
Constant | Value | Description |
QSettings::NativeFormat | 0 | 使用最适合平台的存储格式存储设置。在Windows上,这意味着系统注册表;在macOS和iOS上,这意味着CFPreferences API;在Unix上,这意味着INI格式的文本配置文件。 |
QSettings::Registry32Format | 2 | 仅Windows:从运行在64位Windows上的64位应用程序显式访问32位系统注册表。在32位Windows或64位Windows上的32位应用程序中,这与指定NativeFormat的工作原理相同。这个枚举值是在Qt 5.7中添加的。 |
QSettings::Registry64Format | 3 | 仅Windows:从运行在64位Windows上的32位应用程序显式访问64位系统注册表。在32位Windows或64位Windows上的64位应用程序中,这与指定NativeFormat的工作原理相同。这个枚举值是在Qt 5.7中添加的。 |
QSettings::IniFormat | 1 | 将设置存储在INI文件中。 |
QSettings::InvalidFormat | 16 | 由registerFormat()返回的特殊值。 |
用户范围(
enum QSettings::Scope)
Constant | Value | Description |
QSettings::UserScope | 0 | 将设置存储在特定于当前用户的位置(例如,在用户的主目录中)。 |
QSettings::SystemScope | 1 | 将设置存储在全局位置,以便同一机器上的所有用户访问同一组设置。 |
3.使用Qt默认方式读写配置
3.1 使用注册表方式
Qt提供了一种机制,让程序员可以不用关心程序的设置信息保存到哪里去了,读取设置信息的时候也不用关心去哪里找,非常方便。其内部原理是Qt提供了一些API让程序员只需要简单设置几个名字和值,它就会自动保存到注册表中,注册表的路径由Qt自动管理。
QSettings::QSettings(const QString &organization
, const QString &application = QString(), QObject *parent = Q_NULLPTR)
此函数默认将用户范围设置为QSettings::UserScope,存储格式设置为QSettings::NativeFormat。
3.1.1 如何写入配置信息
#include <QCoreApplication>
#include <QSettings>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSettings set("Moose Tech", "Facturo-Pro");
set.setValue("editor/wrapMargin", 68);
return a.exec();
}
执行后,打开注册表,可以看到Qt自动创建了注册表项。
3.1.2 如何读取配置信息
运行前面的代码,可以看到Qt往注册表写入了配置信息,然后将代码改成下面这样,也就是去掉setValue这一行:
#include <QCoreApplication>
#include <QSettings>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSettings set("Moose Tech", "Facturo-Pro");
//set.setValue("editor/wrapMargin", 68);
int margin = set.value("editor/wrapMargin").toInt();
qDebug()<<"margin="<<margin;
return a.exec();
}
通过上面的例子, 可以看到配置信息是可以永久保存的,是不是很方便呢!
3.1.3 指定用户范围
下面再来看看另外一个构造函数:
QSettings::QSettings(Scope scope, const QString &organization
, const QString &application = QString(), QObject *parent = Q_NULLPTR)
这个函数可以指定用户范围。如果scope是QSettings::UserScope,则先搜索当前用户,再搜索系统所有用户公用的位置。
前面我们用到了QSettings::UserScope,下面再来用一下QSettings::SystemScope,使用示例:
QSettings set(QSettings::SystemScope,"Moose Tech2", "Facturo-Pro");
set.setValue("editor/wrapMargin", 88);
QSettings::UserScope与QSettings::SystemScope区别
对比上面的图片可以看出,QSettings::UserScope创建的注册表项在“HKEY_CURRENT_USER”下,而QSettings::SystemScope创建的注册表在HKEY_USERS下,HKEY_CURRENT_USER是针对当前用户的,而HKEY_USERS是所有用户都可以访问的全局问位置。
3.2 使用INI配置文件
看一下这个函数,这个函数可以指定文件存储格式:
QSettings::QSettings(Format format, Scope scope, const QString &organization
, const QString &application = QString(), QObject *parent = Q_NULLPTR)
之前我们试过了注册表格式,下面我们试一下INI格式,看一下INI生成的位置和生成的内容。
QSettings set(QSettings::IniFormat,QSettings::SystemScope,"Moose Tech2", "Facturo-Pro");
set.setValue("editor/wrapMargin", 88);
在windows上面,生成的INI位置可能是如下中的一个:
- FOLDERID_RoamingAppDataMySoftStar Runner.ini
- FOLDERID_RoamingAppDataMySoft.ini
- FOLDERID_ProgramDataMySoftStar Runner.ini
- FOLDERID_ProgramDataMySoft.ini
FOLDERID_RoamingAppData 通常指向 C:UsersUser NameAppDataRoaming, 也可以通过环境变量%APPDATA%.获得
FOLDERID_ProgramData 通常指向 C:ProgramData.
3.3 指定文件名或注册表路径的构造函数
QSettings::QSettings(const QString &fileName, Format format
, QObject *parent = Q_NULLPTR)
构造一个QSettings对象,用于访问存储在名为fileName的文件中的设置。如果文件不存在,则创建它。
当“format”为“QSettings::NativeFormat”时,“fileName”的含义与平台有关。在Unix上,fileName是INI文件的名称。在macOS和iOS上,fileName是.plist文件的名称。在Windows上,fileName是系统注册表中的路径。
当“format”为“QSettings::IniFormat”时,“fileName”为INI文件名。
警告:此函数是为了方便而提供的。它可以很好地访问由Qt生成的INI或.plist文件,但在这些文件中发现的由其他程序生成的某些语法可能会失败。特别要注意以下限制:
QSettings不提供读取INI“路径”条目的方法,即带有未转义斜杠字符的条目。(这是因为这些条目是不明确的,不能自动解析。)
在INI文件中,QSettings在某些上下文中使用@字符作为元字符,以编码特定于qt的数据类型(例如@ rect),因此当它出现在纯INI文件中时可能会误解它。
3.4 使用程序全局配置的构造函数
QSettings::QSettings(QObject *parent = Q_NULLPTR)
通过调用QCoreApplication::setOrganizationName(), QCoreApplication::setOrganizationDomain()和QCoreApplication::setApplicationName(),构建一个QSettings对象来访问应用程序和组织设置。作用域为QSettings::UserScope,格式为defaultFormat()(默认为QSettings::NativeFormat)。在调用该构造函数之前使用setDefaultFormat()来更改该构造函数使用的默认格式。
QSettings settings("Moose Soft", "Facturo-Pro");
相当于
QCoreApplication::setOrganizationName("Moose Soft");
QCoreApplication::setApplicationName("Facturo-Pro");
QSettings settings;
如果QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName()之前没有被调用,QSettings对象将不能读写任何设置,并且status()将返回AccessError。
在macOS和iOS上,如果同时为组织指定了名称和Internet域,则域名优先于名称。在其他平台上,名称优先于域。
4.读写指定文件名的INI
4.1 读取INI文件
QSettings set("D:/03.TestCode/QtExample/CodeExample/test.ini",QSettings::IniFormat);
set.setValue("User/Name","Xiaoming");//自动创建组名和键名,组名为User
qDebug()<<set.value("User/Name").toString();//读取Name的值
4.2 写入配置到INI
QSettings set("D:/03.TestCode/QtExample/CodeExample/test.ini",QSettings::IniFormat);
set.beginGroup("AppInfo");
set.setValue("AppName","MySoft");
set.setValue("AppVersion","1.05");
set.endGroup();
4.3 写入对象的数据到INI
struct Login {
QString userName;
QString password;
};
QList<Login> logins;
Login l1;
Login l2;
l1.password = "123456";
l1.userName="Liming";
l2.password = "789";
l2.userName="Liming";
logins.push_back(l1);
logins.push_back(l2);
QSettings settings("D:/03.TestCode/QtExample/CodeExample/test.ini",QSettings::IniFormat);
settings.beginWriteArray("logins");
for (int i = 0; i < logins.size(); ++i)
{
settings.setArrayIndex(i);
settings.setValue("userName", logins.at(i).userName);
settings.setValue("password", logins.at(i).password);
}
settings.endArray();
4.4 从INI读取对象的数据
QSettings settings("D:/03.TestCode/QtExample/CodeExample/test.ini",QSettings::IniFormat);
int size = settings.beginReadArray("logins");
for (int i = 0; i < size; ++i) {
settings.setArrayIndex(i);
Login login;
login.userName = settings.value("userName").toString();
login.password = settings.value("password").toString();
logins.append(login);
qDebug()<<"userName="<<login.userName;
qDebug()<<"password="<<login.password<<"n";
}
settings.endArray();
5.读写注册表
5.1 读取注册表
特别注意:
a.如果应用程序版本与操作系统版本位数不一样,则不能用QSettings::NativeFormat,这个时候如果你的系统是64位的,就填QSettings::Registry64Format,反正就填QSettings::Registry32Format
b.注册表路径不要用“/”,而要用“\”
QSettings settings("HKEY_USERS\S-1-5-18\Control Panel\Colors"
,QSettings::Registry64Format);
qDebug()<<settings.value("ActiveBorder").toString();
5.2 写入注册表
QSettings settings("HKEY_CURRENT_USER\Software\2345.com\2345Pic"
,QSettings::Registry64Format);
settings.setValue("Test","123456");
最后
以上就是疯狂玫瑰为你收集整理的Roson讲Qt #4 QSettings(INI和注册表操作)1.概述2.专业术语说明3.使用Qt默认方式读写配置4.读写指定文件名的INI5.读写注册表的全部内容,希望文章能够帮你解决Roson讲Qt #4 QSettings(INI和注册表操作)1.概述2.专业术语说明3.使用Qt默认方式读写配置4.读写指定文件名的INI5.读写注册表所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复