一. QSettings介绍
通常设计应用程序的时候,会希望在应用程序关闭后,记住其设置(窗口大小、位置、选项等)。这些信息通常存储在Windows上的系统注册表中,以及macOS和iOS上的属性列表文件中。在Unix系统上,在没有标准的情况下,许多应用程序(包括KDE应用程序)都使用INI文本文件来保存应用程序的参数设置。Qt提供了QSettings类来支持应用程序的参数保存,利用QSetting,就能够在便携式管理器中保存和恢复应用程序设置。QSettings的APl基于QVariant,能够以最小的工作量保存大多数基于值的类型,如QString ORect和Qlmage。
二. QSettings使用说明
-
QSettings的初始化
创建QSettings对象时,必须传递公司或组织的名称以及应用程序的名称。例如,如果产品名为Star Runner,而公司名为MySoft,则需要按如下方式构造QSettings对象:QSettings settings("MySoft", "Star Runner");
如果在应用程序中的多个位置使用Q设置,则可能需要使用
QCoreApplication:setOrganizationName()
和QCoreApplication:setApplicationNamel()
指定组织名称和应用程序名称,然后使用默认的QSettings钩子函数:QCoreApplication::setOrganizationName("MySoft"); QCoreApplication::setOrganizationDomain("mysoft.com"); QCoreApplication::setApplicationName("Star Runner"); ... QSettings settings;
有时希望访问存储在特定文件或注册表路径中的设置。在所有平台上,如果想直接读取INI文件,可以使用
QSettings
构造函数,该构造函数将文件名作为第一个参数,并将QSettings::IniFormat
作为第二个参数。例如:QSettings settings("/home/petra/misc/myapp.ini", QSettings::IniFormat);
-
QSettings的参数设置
每个设置由一个指定设置名称(节和键组成,通过/
来分割)的QString
和一个存储与密钥相关数据的QVariant
组成。使用setValue()
函数进行参数的设置。例如:settings.setValue("editor/wrapMargin", 68);
如果已经存在具有相同键的设置,则新值将覆盖现有值。为了提高效率,更改可能不会立即保存到永久存储中。(可以调用
sync()
来提交更改。) -
QSettings的参数读取
通过value()
函数读取参数:int margin = settings.value("editor/wrapMargin").toInt();
如果没有找到指定名称的设置,QSettings将返回一个空的
QVariant
(可以转换为整数0)。您可以通过向value()
传递第二个参数来指定另一个默认值(即使这个参数不存在,也会返回这个默认参数):int margin = settings.value("editor/wrapMargin", 80).toInt();
-
QSettings中的参数的查删减
调用contains()
测试给定的键是否存在。调用remove()
删除与键关联的设置。调用allKeys()
获取所有密钥的列表。调用clear()
删除所有键。 -
参数名称(键)的命名规则
设置键可以包含任何Unicode字符。Windows注册表和INI文件使用不区分大小写的键,而macOS和iOS上的CFPreferences API使用区分大小写键。为了避免可移植性问题,请遵循以下简单规则:- 始终使用相同的案例引用相同的密钥。例如,如果您在代码中的某个位置将键称为
text font
,则不要在其他位置将其称为Text Fonts
。 - 除大小写外,应避免使用相同的键名。例如,如果您有一个名为
MainWindow
的键,请不要尝试将另一个键保存为mainwindow
。 - 不要在节或关键字名称中使用斜杠(
/
和\
);反斜杠字符用于分隔子键(见下文)。在窗口上,\
由QSettings转换为/
,这使它们完全相同。
可以使用“/”字符作为分隔符来形成分层键,类似于Unix文件路径。例如:
settings.setValue("mainwindow/size", win->size()); settings.setValue("mainwindow/fullScreen", win->isFullScreen()); settings.setValue("outputpanel/visible", panel->isVisible());
如果要保存或恢复许多具有相同前缀的设置,可以使用
beginGroup()
指定前缀,并在末尾调用endGroup()
。下面是同样的例子,但这次使用的是组机制:settings.beginGroup("mainwindow"); settings.setValue("size", win->size()); settings.setValue("fullScreen", win->isFullScreen()); settings.endGroup(); settings.beginGroup("outputpanel"); settings.setValue("visible", panel->isVisible()); settings.endGroup();
- 始终使用相同的案例引用相同的密钥。例如,如果您在代码中的某个位置将键称为
-
QSettings的线程安全性
Q设置是可重入的。这意味着可以在不同的线程中同时使用不同的QSettings对象。即使QSettings对象引用磁盘上的相同文件(或系统注册表中的相同条目)。如果通过一个QSettings对象修改了设置,则在同一位置操作并处于同一进程中的任何其他QSettingss对象中都会立即看到更改。只要满足某些条件,就可以从不同的进程(可以是同时运行的应用程序的不同实例,也可以是完全不同的应用程序)安全地使用Q设置来读取和写入相同的系统位置。对于QSettings::IniFormat
,它使用咨询文件锁定和智能合并算法来确保数据的完整性。这样做的条件是,可写配置文件必须是一个常规文件,并且必须位于当前用户可以在其中创建新的临时文件的目录中 -
QSettings保存的配置文件在系统中的存储位置
-
在Unix系统上,如果文件格式为
NativeFormat
,则默认使用以下文件(如果未设置XDG_CONFIG_DIRS
,则使用/etc/XDG
的默认值):- $HOME/.config/MySoft/Star Runner.conf (Qt for Embedded Linux: $HOME/Settings/MySoft/Star Runner.conf)
- $HOME/.config/MySoft.conf (Qt for Embedded Linux: $HOME/Settings/MySoft.conf)
- for each directory <dir> in $XDG_CONFIG_DIRS: <dir>/MySoft/Star Runner.conf
- for each directory <dir> in $XDG_CONFIG_DIRS: <dir>/MySoft.conf
-
在macOS 10.2和10.3版本上,默认使用以下文件:
- $HOME/Library/Preferences/com.MySoft.Star Runner.plist
- $HOME/Library/Preferences/com.MySoft.plist
- /Library/Preferences/com.MySoft.Star Runner.plist
- /Library/Preferences/com.MySoft.plist
-
在Windows上,
NativeFormat
设置存储在以下注册表路径中(在Windows上,对于在WOW64模式下运行的32位程序,设置存储在以下注册表路径中:HKEY_LOCAL_MACHINE\Software\WOW6432node
。就是应用程序主目录中的Settings/MySoft/StarRunner.conf
。):- HKEY_CURRENT_USER\Software\MySoft\Star Runner
- HKEY_CURRENT_USER\Software\MySoft\OrganizationDefaults
- HKEY_LOCAL_MACHINE\Software\MySoft\Star Runner
- HKEY_LOCAL_MACHINE\Software\MySoft\OrganizationDefaults
-
如果文件格式为
IniFormat
,则在Unix、macOS和iOS上使用以下文件(如果未设置XDG_CONFIG_DIRS
,则使用/etc/XDG
的默认值。):- $HOME/.config/MySoft/Star Runner.ini (Qt for Embedded Linux: $HOME/Settings/MySoft/Star Runner.ini)
- $HOME/.config/MySoft.ini (Qt for Embedded Linux: $HOME/Settings/MySoft.ini)
- for each directory <dir> in $XDG_CONFIG_DIRS: <dir>/MySoft/Star Runner.ini
- for each directory <dir> in $XDG_CONFIG_DIRS: <dir>/MySoft.ini
在Windows上,使用以下文件(
FOLDRID_RoamingAppData
通常指向C:\Users\UserName\AppData\Roaming
,也由环境变量%AppData%
显示。FOLDERID_ProgramData
通常指向C:\ProgramData
。):- FOLDERID_RoamingAppData\MySoft\Star Runner.ini
- FOLDERID_RoamingAppData\MySoft.ini
- FOLDERID_ProgramData\MySoft\Star Runner.ini
- FOLDERID_ProgramData\MySoft.ini
-