QSettings Class
QSettings 类提供与平台无关的持久性应用程序设置。更多
Header: | #include <QSettings> |
CMake.QSettings | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
继承: | QObject |
- 所有成员的列表,包括继承成员
- QSettings 属于Input/Output 和 Networking。
注:该类中的所有函数都是可重入的。
注:这些函数也是线程安全的:
- registerFormat(const QString &extension, QSettings::ReadFunc readFunc, QSettings::WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity)
公共类型
enum | Format { NativeFormat, Registry32Format, Registry64Format, IniFormat, WebLocalStorageFormat, …, InvalidFormat } |
ReadFunc | |
enum | Scope { UserScope, SystemScope } |
SettingsMap | |
enum | Status { NoError, AccessError, FormatError } |
WriteFunc |
公共函数
QSettings(QObject *parent = nullptr) | |
QSettings(QSettings::Scope scope, QObject *parent = nullptr) | |
QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr) | |
QSettings(const QString &organization, const QString &application = QString(), QObject *parent = nullptr) | |
QSettings(QSettings::Scope scope, const QString &organization, const QString &application = QString(), QObject *parent = nullptr) | |
QSettings(QSettings::Format format, QSettings::Scope scope, const QString &organization, const QString &application = QString(), QObject *parent = nullptr) | |
virtual | ~QSettings() |
QStringList | allKeys() const |
QString | applicationName() const |
void | beginGroup(QAnyStringView prefix) |
int | beginReadArray(QAnyStringView prefix) |
void | beginWriteArray(QAnyStringView prefix, int size = -1) |
QStringList | childGroups() const |
QStringList | childKeys() const |
void | clear() |
bool | contains(QAnyStringView key) const |
void | endArray() |
void | endGroup() |
bool | fallbacksEnabled() const |
QString | fileName() const |
QSettings::Format | format() const |
QString | group() const |
bool | isAtomicSyncRequired() const |
bool | isWritable() const |
QString | organizationName() const |
void | remove(QAnyStringView key) |
QSettings::Scope | scope() const |
void | setArrayIndex(int i) |
void | setAtomicSyncRequired(bool enable) |
void | setFallbacksEnabled(bool b) |
void | setValue(QAnyStringView key, const QVariant &value) |
QSettings::Status | status() const |
void | sync() |
QVariant | value(QAnyStringView key) const |
QVariant | value(QAnyStringView key, const QVariant &defaultValue) const |
静态公共成员
QSettings::Format | defaultFormat() |
QSettings::Format | registerFormat(const QString &extension, QSettings::ReadFunc readFunc, QSettings::WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive) |
void | setDefaultFormat(QSettings::Format format) |
void | setPath(QSettings::Format format, QSettings::Scope scope, const QString &path) |
重新实现的受保护函数
virtual bool | event(QEvent *event) override |
详细说明
用户通常希望应用程序能跨会话记住其设置(窗口大小和位置、选项等)。在 Windows 系统中,这些信息通常存储在系统注册表中;在 macOS 和 iOS 系统中,则存储在属性列表文件中。在 Unix 系统上,由于缺乏标准,许多应用程序(包括 KDE 应用程序)都使用 INI 文本文件。
QSettings 是对这些技术的抽象,使您能以可移植的方式保存和恢复应用程序设置。它还支持custom storage formats 。
QSettings 的 API 基于QVariant ,允许您以最小的代价保存大多数基于值的类型,如QString 、QRect 和QImage 。
如果您需要的只是基于内存的非持久结构,可以考虑使用QMap<QString,QVariant> 代替。
基本用法
创建 QSettings 对象时,必须传递公司或组织的名称以及应用程序的名称。例如,如果您的产品名称是 Star Runner,而您的公司名称是 MySoft,那么您将按如下方式创建 QSettings 对象:
QSettings settings("MySoft", "Star Runner");
QSettings 对象可以在堆栈或堆上创建(即使用new
)。构建和销毁 QSettings 对象的速度非常快。
如果您在应用程序中的许多地方使用 QSettings,您可能需要使用QCoreApplication::setOrganizationName() 和QCoreApplication::setApplicationName() 指定组织名称和应用程序名称,然后使用默认的 QSettings 构造函数:
QCoreApplication::setOrganizationName("MySoft"); QCoreApplication::setOrganizationDomain("mysoft.com"); QCoreApplication::setApplicationName("Star Runner"); ... QSettings settings;
(这里,我们还指定了组织的 Internet 域名。设置 Internet 域名后,macOS 和 iOS 将使用该域名代替组织名称,因为 macOS 和 iOS 应用程序通常使用 Internet 域名来标识自己。如果没有设置域,则会从组织名称导出一个假域。详见下文Platform-Specific Notes )。
QSettings 可存储设置。每个设置由一个指定设置名称(密钥)的QString 和一个存储与密钥相关数据的QVariant 组成。要写入设置,请使用setValue() 。例如
settings.setValue("editor/wrapMargin", 68);
如果已经存在具有相同键值的设置,现有值将被新值覆盖。为提高效率,更改可能不会立即保存到永久存储区。(您可以随时调用sync() 来提交更改)。
您可以使用value() 找回设置值:
int margin = settings.value("editor/wrapMargin").toInt();
如果没有指定名称的设置,QSettings 会返回一个空值QVariant (可转换为整数 0)。您可以通过向value() 传递第二个参数来指定另一个默认值:
int margin = settings.value("editor/wrapMargin", 80).toInt();
要测试给定键是否存在,请调用contains() 。要删除与键相关的设置,请调用remove() 。要获取所有键的列表,请调用allKeys() 。要删除所有按键,请调用clear() 。
QVariant 和 GUI 类型
由于QVariant 是Qt Core 模块的一部分,因此它不能提供与数据类型的转换函数,如QColor,QImage, 和QPixmap ,它们是Qt GUI 的一部分。换句话说,在QVariant 中没有toColor()
,toImage()
, 或toPixmap()
函数。
相反,您可以使用QVariant::value() 模板函数。例如
QSettings settings("MySoft", "Star Runner"); QColor color = settings.value("DataPump/bgcolor").value<QColor>();
对于QVariant 支持的所有数据类型(包括 GUI 相关类型),反向转换(如从QColor 转换为QVariant )都是自动进行的:
QSettings settings("MySoft", "Star Runner"); QColor color = palette().background().color(); settings.setValue("DataPump/bgcolor", color);
使用qRegisterMetaType() 注册的自定义类型有用于流式传输到QDataStream 的操作符,可使用 QSettings 存储。
部分和键语法
设置键可以包含任何 Unicode 字符。文件格式和操作系统将决定它们是否区分大小写。在 Windows 系统中,注册表和 INI 文件将使用不区分大小写的键值,而使用registerFormat() 注册的用户指定格式则可以区分大小写。在 Unix 系统中,键值始终区分大小写。
为避免出现可移植性问题,请遵循以下简单规则:
- 始终使用相同的大小写引用同一个键。例如,如果你在代码的某处将某个键称为 "text fonts"(文本字体),就不要在其他地方将其称为 "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();
如果使用beginGroup() 设置了组,大多数函数的行为都会随之改变。组可以递归设置。
除组之外,QSettings 还支持 "数组 "概念。详见beginReadArray() 和beginWriteArray() 。
回退机制
假设您创建了一个 QSettings 对象,其组织名称为 MySoft,应用程序名称为 Star Runner。查找值时,最多会按以下顺序搜索四个位置:
- Star Runner 应用程序的用户特定位置
- MySoft 所有应用程序的用户特定位置
- Star Runner 应用程序的全系统位置
- MySoft 所有应用程序的全系统位置
(有关 Qt 支持的不同平台上这些位置的信息,请参见Platform-Specific Notes )。
如果在第一个位置找不到密钥,则在第二个位置继续搜索,依此类推。这样,您就可以存储全系统或全组织范围的设置,并在每个用户或每个应用程序的基础上覆盖这些设置。要关闭此机制,请调用setFallbacksEnabled(false)。
虽然所有四个位置的密钥都可以读取,但只有第一个文件(当前应用程序的用户特定位置)可以写入。要写入任何其他文件,请省略应用程序名称和/或指定QSettings::SystemScope (而不是默认的QSettings::UserScope )。
让我们举例说明:
QSettings obj1("MySoft", "Star Runner"); QSettings obj2("MySoft"); QSettings obj3(QSettings::SystemScope, "MySoft", "Star Runner"); QSettings obj4(QSettings::SystemScope, "MySoft");
下表总结了哪些 QSettings 对象可以访问哪些位置。X"表示该位置是与 QSettings 对象相关联的主要位置,用于读取和写入;"o "表示该位置在读取时用作后备位置。
位置 | obj1 | obj2 | obj3 | obj4 |
---|---|---|---|---|
1.用户、应用程序 | X | |||
2.用户,组织 | o | X | ||
3.系统、应用程序 | o | X | ||
4.系统、组织 | o | o | o | X |
这种机制的优点在于它能在 Qt 支持的所有平台上运行,而且仍能为您提供很大的灵活性,无需指定任何文件名或注册表路径。
如果您想在所有平台上使用 INI 文件而不是本地 API,您可以将QSettings::IniFormat 作为第一个参数传递给 QSettings 构造函数,然后再传递作用域、组织名称和应用程序名称:
请注意,INI 文件无法区分数字数据和用于编码的字符串,因此以数字形式写入的值将以QString 的形式读回。可以使用QString::toInt(),QString::toDouble() 和相关函数恢复数值。
恢复图形用户界面应用程序的状态
QSettings 通常用于存储图形用户界面应用程序的状态。下面的示例说明了如何使用 QSettings 保存和恢复应用程序主窗口的几何图形。
void MainWindow::writeSettings() { QSettings settings("Moose Soft", "Clipper"); settings.beginGroup("MainWindow"); settings.setValue("geometry", saveGeometry()); settings.endGroup(); } void MainWindow::readSettings() { QSettings settings("Moose Soft", "Clipper"); settings.beginGroup("MainWindow"); const auto geometry = settings.value("geometry", QByteArray()).toByteArray(); if (geometry.isEmpty()) setGeometry(200, 200, 400, 400); else restoreGeometry(geometry) settings.endGroup(); }
有关为什么最好调用QWidget::resize() 和QWidget::move() 而不是QWidget::setGeometry() 来还原窗口几何图形的讨论,请参阅窗口几何图形。
必须在主窗口的构造函数和关闭事件处理程序中调用readSettings()
和writeSettings()
函数,具体如下:
MainWindow::MainWindow() { ... readSettings(); } void MainWindow::closeEvent(QCloseEvent *event) { if (userReallyWantsToQuit()) { writeSettings(); event->accept(); } else { event->ignore(); } }
同时从多个线程或进程访问设置
QSettings 是可重入的。这意味着你可以在不同的线程中同时使用不同的 QSettings 对象。即使 QSettings 对象引用了磁盘上的相同文件(或系统注册表中的相同条目),也能保证这一点。如果通过一个 QSettings 对象修改了某项设置,那么在同一位置上运行并处于同一进程中的任何其他 QSettings 对象都将立即看到该更改。
只要满足某些条件,不同进程(可以是同时运行的应用程序的不同实例,也可以是完全不同的应用程序)都可以安全地使用 QSettings 来读写相同的系统位置。对于QSettings::IniFormat ,它使用咨询文件锁定和智能合并算法来确保数据完整性。这样做的条件是,可写配置文件必须是普通文件,而且必须位于当前用户可以创建新临时文件的目录中。如果不是这种情况,则必须使用setAtomicSyncRequired() 关闭安全机制。
请注意,sync() 会导入其他进程所做的更改(除了从本 QSettings 写入更改外)。
特定平台注意事项
存储应用程序设置的位置
如Fallback Mechanism 部分所述,QSettings 最多可将应用程序的设置存储在四个位置,具体取决于设置是用户特定的还是系统范围的,以及设置是应用程序特定的还是组织范围的。为简单起见,我们假设组织名为 MySoft,应用程序名为 Star Runner。
在 Unix 系统中,如果文件格式为NativeFormat ,默认使用以下文件:
$HOME/.config/MySoft/Star Runner.conf
$HOME/.config/MySoft.conf
- for each directory <dir> in $XDG_CONFIG_DIRS:
<dir>/MySoft/Star Runner.conf
- 为 $XDG_CONFIG_DIRS 中的每个目录 <dir>:
<dir>/MySoft.conf
注意: 如果未设置 XDG_CONFIG_DIRS,则使用默认值/etc/xdg
。
在 macOS 和 iOS 上,如果文件格式为NativeFormat ,则默认使用这些文件:
$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 设置存储在以下注册表路径中:
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
注: 在 Windows 上,对于以 WOW64 模式运行的 32 位程序,设置存储在以下注册表路径中:HKEY_LOCAL_MACHINE\Software\WOW6432node
。
如果文件格式为NativeFormat ,则为应用程序主目录中的 "Settings/MySoft/Star Runner.conf"。
如果文件格式为IniFormat ,则在 Unix、macOS 和 iOS 上使用以下文件:
$HOME/.config/MySoft/Star Runner.ini
$HOME/.config/MySoft.ini
- for each directory <dir> in $XDG_CONFIG_DIRS:
<dir>/MySoft/Star Runner.ini
- 为 $XDG_CONFIG_DIRS 中的每个目录 <dir>:
<dir>/MySoft.ini
注: 如果未设置 XDG_CONFIG_DIRS,则使用默认值/etc/xdg
。
在 Windows 中,将使用以下文件:
FOLDERID_RoamingAppData\MySoft\Star Runner.ini
FOLDERID_RoamingAppData\MySoft.ini
FOLDERID_ProgramData\MySoft\Star Runner.ini
FOLDERID_ProgramData\MySoft.ini
以FOLDERID_
为前缀的标识符是特殊的项目 ID 列表,将传递给 Win32 API 函数SHGetKnownFolderPath()
以获取相应的路径。
FOLDERID_RoamingAppData
通常指向 C:\Users\User Name\AppData\Roaming
,也由环境变量%APPDATA%
显示。
FOLDERID_ProgramData
通常指向 。C:\ProgramData
如果文件格式为IniFormat ,则为应用程序主目录下的 "Settings/MySoft/Star Runner.ini"。
可以使用setPath() 更改.ini
和.conf
文件的路径。在 Unix、macOS 和 iOS 上,用户可以通过设置XDG_CONFIG_HOME
环境变量来覆盖它们;详情请参见setPath() 。
直接访问 INI 和 .plist 文件
有时,你确实希望访问存储在特定文件或注册表路径中的设置。在所有平台上,如果要直接读取 INI 文件,可以使用 QSettings 构造函数,该函数将文件名作为第一个参数,并将QSettings::IniFormat 作为第二个参数。例如
然后就可以使用 QSettings 对象读写文件中的设置。
在 macOS 和 iOS 上,通过传递QSettings::NativeFormat 作为第二个参数,可以访问属性列表.plist
文件。例如
直接访问 Windows 注册表
在 Windows 中,QSettings 可让您访问系统注册表中用 QSettings 写入的设置(或支持格式的设置,如字符串数据)。方法是用注册表中的路径和QSettings::NativeFormat 构建一个 QSettings 对象。
例如
在指定路径下出现的所有注册表项都可以像往常一样通过 QSettings 对象读取或写入(使用正斜杠而不是反斜杠)。例如
settings.setValue("11.0/Outlook/Security/DontTrustInstalledFiles", 0);
请注意,如前所述,QSettings 使用反斜线字符来分隔子键。因此,你无法读取或写入包含斜线或反斜线的 Windows 注册表项;如果需要这样做,应使用本地 Windows API。
访问 Windows 上的常用注册表设置
在 Windows 中,键值可能同时具有值和子键。使用 "Default "或". "代替子键即可访问其默认值:
settings.setValue("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy", "Milkyway"); settings.setValue("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Sun", "OurStar"); settings.value("HKEY_CURRENT_USER\\MySoft\\Star Runner\\Galaxy\\Default"); // returns "Milkyway"
在 Windows 以外的其他平台上,"Default "和". "将被视为常规子键。
平台限制
虽然 QSettings 试图消除不同支持平台之间的差异,但在移植应用程序时,仍有一些差异需要注意:
- Windows 系统注册表有以下限制:子键不得超过 255 个字符,条目的值不得超过 16,383 个字符,键的所有值不得超过 65,535 个字符。绕过这些限制的一种方法是使用IniFormat 而不是NativeFormat 来存储设置。
- 在 Windows 系统中,当使用 Windows 系统注册表时,QSettings 不会保留值的原始类型。因此,当设置新值时,值的类型可能会改变。例如,类型为
REG_EXPAND_SZ
的值将变为REG_SZ
。 - 在 macOS 和 iOS 上,allKeys() 会返回一些适用于所有应用程序的全局设置的额外键值。使用value() 可以读取这些键值,但不能更改,只能隐藏。调用setFallbacksEnabled(false) 将隐藏这些全局设置。
- 在 macOS 和 iOS 上,QSettings 使用的 CFPreferences API 希望使用互联网域名而不是组织名称。为了提供统一的 API,QSettings 会根据组织名称生成一个假域名(除非组织名称已经是一个域名,如 OpenOffice.org)。该算法会在公司名称后附加".com",并用连字符替换空格和其他非法字符。如果要指定不同的域名,请在
main()
函数中调用QCoreApplication::setOrganizationDomain(),QCoreApplication::setOrganizationName(),QCoreApplication::setApplicationName() ,然后使用默认的 QSettings 构造函数。另一种解决方案是使用预处理器指令,例如 - 在 macOS 上,访问不属于当前用户的设置(即SystemScope )的权限从 10.7(Lion)版本开始发生了变化。在该版本之前,拥有管理员权限的用户可以访问这些设置。在 10.7 和 10.8(Mountain Lion)版本中,只有 root 才能访问。不过,10.9(Mavericks)再次改变了这一规则,但仅限于本地格式(plist 文件)。
另请参阅 QVariant 和QSessionManager 。
成员类型文档
enum QSettings::Format
该枚举类型指定QSettings 使用的存储格式。
常量 | 值 | 说明 |
---|---|---|
QSettings::NativeFormat | 0 | 使用最适合平台的存储格式存储设置。在 Windows 上,指的是系统注册表;在 macOS 和 iOS 上,指的是 CFPreferences API;在 Unix 上,指的是 INI 格式的文本配置文件。 |
QSettings::Registry32Format | 2 | 仅限 Windows:通过在 64 位 Windows 上运行的 64 位应用程序显式访问 32 位系统注册表。在 32 位 Windows 上或从 64 位 Windows 上的 32 位应用程序访问 32 位系统注册表与指定 NativeFormat 的效果相同。该枚举值在 Qt 5.7 中添加。 |
QSettings::Registry64Format | 3 | 仅适用于 Windows:从在 64 位 Windows 上运行的 32 位应用程序显式访问 64 位系统注册表。在 32 位 Windows 上或从 64 位 Windows 上的 64 位应用程序访问 64 位系统注册表与指定 NativeFormat 的效果相同。该枚举值在 Qt 5.7 中添加。 |
QSettings::IniFormat | 1 | 在 INI 文件中存储设置。请注意,INI 文件无法区分数字数据和用于编码的字符串,因此以数字形式写入的值将以QString 的形式读回。 |
QSettings::WebLocalStorageFormat | 4 | 仅限 WASM:在 window.localStorage 中存储当前原点的设置。如果不允许使用 cookie,则会退回到 INI 格式。这将为每个源提供高达 5MiB 的存储空间,但对它的访问是同步的,而且不需要 JSPI。 |
QSettings::WebIndexedDBFormat | 5 | 仅限 WASM:将设置存储在当前起源的索引数据库中。如果不允许使用 cookie,就会退回到 INI 格式。这需要 JSPI,但提供了比 WebLocalStorageFormat 更多的存储空间。 |
QSettings::InvalidFormat | 16 | registerFormat() 返回的特殊值。 |
在 Unix 上,NativeFormat 和 IniFormat 含义相同,只是文件扩展名不同(.conf
表示 NativeFormat,.ini
表示 IniFormat)。
INI 文件格式是一种 Windows 文件格式,Qt 支持所有平台。在没有 INI 标准的情况下,我们尽量遵循微软的做法,但有以下例外:
- 如果您存储了QVariant 无法转换为QString 的类型(如QPoint,QRect, 和QSize ),Qt 会使用基于
@
的语法对类型进行编码。例如pos = @Point(100 100)
为了尽量减少兼容性问题,任何不出现在值的第一个位置或后面没有 Qt 类型的
@
(Point
,Rect
,Size
, 等等)都会被当作普通字符。 - 虽然反斜线在 INI 文件中是一个特殊字符,但大多数 Windows 应用程序都不会在文件路径中转义反斜线 (
\
):windir = C:\Windows
QSettings Windows 总是将反斜杠视为特殊字符,并且不提供读写此类条目的 API。
- INI 文件格式对键的语法有严格限制。Qt XML 通过在键中使用
%
作为转义字符来解决这个问题。此外,如果你保存了一个顶级设置(键中没有斜线,如 "someKey"),它将出现在 INI 文件的 "常规 "部分。为避免覆盖其他键,如果使用 "General/someKey "这样的键保存设置,该键将位于"%General "部分,而不是"General "部分。 - 与目前大多数实现一样,QSettings 将假定 INI 文件中的值是 UTF-8 编码。这意味着值将被解码为 UTF-8 编码条目并写回 UTF-8。为保持与旧版 Qt 的向后兼容性,INI 文件中的键值以 %-encoded 格式写入,但可以 %-encoded 和 UTF-8 两种格式读取。
与旧版 Qt 兼容
请注意,这种行为与QSettings 在 Qt 6 之前的 Qt 版本中的行为不同。使用 Qt 5 或更早版本编写的 INI 文件完全可以被基于 Qt 6 的应用程序读取(除非设置了不同于 utf8 的 INI 编解码器)。但只有将 "iniCodec "设置为UTF-8 文本编解码器,用 Qt 6 编写的 INI 文件才能被旧版本的 Qt 读取。
另请参阅 registerFormat() 和setPath()。
QSettings::ReadFunc
用于指向具有以下签名的函数指针的类型定义:
ReadFunc
registerFormat()
ReadFunc
应一次性读取所有选项,并返回 容器中的所有设置,该容器最初为空。SettingsMap
另请参见 WriteFunc 和registerFormat()。
enum QSettings::Scope
该枚举指定设置是针对特定用户还是同一系统的所有用户共享。
常量 | 值 | 说明 |
---|---|---|
QSettings::UserScope | 0 | 将设置存储在当前用户的特定位置(如用户的主目录)。 |
QSettings::SystemScope | 1 | 将设置存储在全局位置,以便同一台机器上的所有用户访问同一套设置。 |
另请参阅 setPath()。
QSettings::SettingsMap
另请参见 registerFormat().
enum QSettings::Status
可能的状态值如下
常量 | 值 | 说明 |
---|---|---|
QSettings::NoError | 0 | 未发生错误。 |
QSettings::AccessError | 1 | 发生访问错误(如试图写入只读文件)。 |
QSettings::FormatError | 2 | 发生格式错误(如加载格式错误的 INI 文件)。 |
另请参阅 status()。
QSettings::WriteFunc
用于指向具有以下签名的函数的指针的类型定义:
WriteFunc
在 中用作指向写入一组键/值对的函数的指针。 只被调用一次,因此需要一次性输出设置。registerFormat()
WriteFunc
另请参阅 ReadFunc 和registerFormat()。
成员函数文档
QVariant QSettings::value(QAnyStringView key) const
QVariant QSettings::value(QAnyStringView key, const QVariant &defaultValue) const
返回设置key 的值。如果设置不存在,则返回defaultValue 。
如果没有指定默认值,则返回默认的QVariant 。
根据文件格式和操作系统的不同,键查找对大小写敏感或不敏感。为避免出现可移植性问题,请参阅Section and Key Syntax 规则。
举例说明
QSettings settings; settings.setValue("animal/snake", 58); settings.value("animal/snake", 1024).toInt(); // returns 58 settings.value("animal/zebra", 1024).toInt(); // returns 1024 settings.value("animal/zebra").toInt(); // returns 0
注意: 在 6.4 之前的 Qt XML 版本中,此函数使用QString ,而不是QAnyStringView 。
另请参阅 setValue()、contains() 和remove()。
[explicit]
QSettings::QSettings(QObject *parent = nullptr)
构造一个 QSettings 对象,用于访问之前通过调用QCoreApplication::setOrganizationName() 、QCoreApplication::setOrganizationDomain() 和QCoreApplication::setApplicationName() 设置的应用程序和组织机构的设置。
范围是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)和名称(默认用于其他平台),不过如果您只提供其中一个,代码也能应付,因为在所有平台上都将使用域,这与非默认平台上的文件通常命名方式不符。
另请参见 QCoreApplication::setOrganizationName()、QCoreApplication::setOrganizationDomain()、QCoreApplication::setApplicationName() 和setDefaultFormat()。
[explicit]
QSettings::QSettings(QSettings::Scope scope, QObject *parent = nullptr)
构造一个 QSettings 对象,方法与 QSettings(QObject *parent)相同,但使用给定的scope 。
另请参阅 QSettings(QObject *parent)。
QSettings::QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr)
构造一个 QSettings 对象,用于访问存储在名为fileName 的文件中的设置,该文件的父文件为parent 。如果该文件不存在,则将创建该文件。
如果format 是QSettings::NativeFormat ,则fileName 的含义取决于平台。在 Unix 上,fileName 是 INI 文件的名称。在 macOS 和 iOS 上,fileName 是.plist
文件的名称。在 Windows 上,fileName 是系统注册表中的一个路径。
如果format 是QSettings::IniFormat ,fileName 就是 INI 文件的名称。
警告: 提供此函数是为了方便。它能很好地访问由 Qt XML 生成的 INI 或.plist
文件,但可能无法访问由其他程序生成的此类文件中的某些语法。请特别注意以下限制:
- QSettings 无法读取 INI "路径 "条目,即带有未转义斜线字符的条目。(这是因为这些条目模棱两可,无法自动解决)。
- 在 INI 文件中,QSettings 在某些上下文中将
@
字符用作元字符,以编码 Qt 特有的数据类型(如@Rect
),因此当它出现在纯 INI 文件中时,可能会被误解。
另请参见 fileName().
[explicit]
QSettings::QSettings(const QString &organization, const QString &application = QString(), QObject *parent = nullptr)
构造一个 QSettings 对象,用于访问名为application 的应用程序的设置,该设置来自名为organization 的组织,并具有父级parent 。
示例
QSettings settings("Moose Tech", "Facturo-Pro");
范围设置为QSettings::UserScope ,格式设置为QSettings::NativeFormat (即在调用此构造函数之前调用setDefaultFormat() 没有任何作用)。
另请参阅 setDefaultFormat() 和Fallback Mechanism 。
QSettings::QSettings(QSettings::Scope scope, const QString &organization, const QString &application = QString(), QObject *parent = nullptr)
构造一个 QSettings 对象,用于从名为organization 的机构访问名为application 的应用程序的设置,其父机构为parent 。
如果scope 是QSettings::UserScope ,QSettings 对象会首先搜索特定于用户的设置,然后才搜索系统范围内的设置作为备用。如果scope 是QSettings::SystemScope ,则 QSettings 对象会忽略特定于用户的设置,并提供对全系统设置的访问。
存储格式设置为QSettings::NativeFormat (也就是说,在调用此构造函数之前调用setDefaultFormat() 没有任何作用)。
如果没有给出应用程序名称,QSettings 对象将仅访问组织范围内的locations 。
另请参见 setDefaultFormat()。
QSettings::QSettings(QSettings::Format format, QSettings::Scope scope, const QString &organization, const QString &application = QString(), QObject *parent = nullptr)
构造一个 QSettings 对象,用于从名为organization 的机构访问名为application 的应用程序的设置,其父机构为parent 。
如果scope 是QSettings::UserScope ,QSettings 对象会首先搜索特定于用户的设置,然后才搜索系统范围内的设置作为备用。如果scope 是QSettings::SystemScope ,则 QSettings 对象会忽略特定于用户的设置,并提供对整个系统设置的访问。
如果format 是QSettings::NativeFormat ,则使用本地 API 来存储设置。如果format 是QSettings::IniFormat ,则使用 INI 格式。
如果没有给出应用程序名称,QSettings 对象将仅访问组织范围内的locations 。
[virtual noexcept]
QSettings::~QSettings()
销毁QSettings 对象。
任何未保存的更改最终都将写入永久存储空间。
另请参见 sync().
QStringList QSettings::allKeys() const
返回可使用QSettings 对象读取的所有键(包括子键)的列表。
示例
QSettings settings; settings.setValue("fridge/color", QColor(Qt::white)); settings.setValue("fridge/size", QSize(32, 96)); settings.setValue("sofa", true); settings.setValue("tv", false); QStringList keys = settings.allKeys(); // keys: ["fridge/color", "fridge/size", "sofa", "tv"]
如果使用beginGroup() 设置了组,则只返回组中的键,不带组前缀:
settings.beginGroup("fridge"); keys = settings.allKeys(); // keys: ["color", "size"]
另请参阅 childGroups() 和childKeys()。
QString QSettings::applicationName() const
返回用于存储设置的应用程序名称。
另请参阅 QCoreApplication::applicationName()、format()、scope() 和organizationName()。
void QSettings::beginGroup(QAnyStringView prefix)
将prefix 添加到当前组。
在QSettings 中指定的所有键都会自动预置当前组。此外,查询函数(如childGroups(),childKeys() 和allKeys() )也基于组。默认情况下不设置组。
组对于避免重复输入相同的设置路径非常有用。例如
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();
这将设置三个设置的值:
mainwindow/size
mainwindow/fullScreen
outputpanel/visible
调用endGroup() 可将当前组重置为调用相应 beginGroup() 之前的值。组可以嵌套。
注意: 在 6.4 之前的 Qt 版本中,此函数使用QString ,而不是QAnyStringView 。
int QSettings::beginReadArray(QAnyStringView prefix)
将prefix 添加到当前分组,并开始从数组中读取数据。返回数组的大小。
示例
struct Login { QString userName; QString password; }; QList<Login> logins; ... QSettings settings; 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); } settings.endArray();
首先使用beginWriteArray() 写入数组。
注意: 在 6.4 之前的 Qt XML 版本中,此函数使用QString ,而不是QAnyStringView 。
另请参阅 beginWriteArray()、endArray() 和setArrayIndex()。
void QSettings::beginWriteArray(QAnyStringView prefix, int size = -1)
将prefix 添加到当前分组,并开始写入大小为size 的数组。如果size 为 -1(默认值),则会根据写入条目的索引自动确定。
如果某一组键的出现次数很多,可以使用数组来简化操作。例如,假设要保存一个长度可变的用户名和密码列表。你可以这样写
struct Login { QString userName; QString password; }; QList<Login> logins; ... QSettings settings; settings.beginWriteArray("logins"); for (qsizetype 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();
生成的密钥格式为
logins/size
logins/1/userName
logins/1/password
logins/2/userName
logins/2/password
logins/3/userName
logins/3/password
- ...
要读回数组,请使用beginReadArray() 。
注意: 在 6.4 之前的 Qt XML 版本中,该函数使用的是QString ,而不是QAnyStringView 。
另请参阅 beginReadArray()、endArray() 和setArrayIndex()。
QStringList QSettings::childGroups() const
返回包含可使用QSettings 对象读取的键的所有键顶层组的列表。
示例
QSettings settings; settings.setValue("fridge/color", QColor(Qt::white)); settings.setValue("fridge/size", QSize(32, 96)); settings.setValue("sofa", true); settings.setValue("tv", false); QStringList groups = settings.childGroups(); // groups: ["fridge"]
如果使用beginGroup() 设置了一个组,则会返回该组中不包含组前缀的一级键。
settings.beginGroup("fridge"); groups = settings.childGroups(); // groups: []
使用childKeys() 和 childGroups() 可以递归浏览整个设置层次。
QStringList QSettings::childKeys() const
返回可使用QSettings 对象读取的所有顶层键的列表。
示例
QSettings settings; settings.setValue("fridge/color", QColor(Qt::white)); settings.setValue("fridge/size", QSize(32, 96)); settings.setValue("sofa", true); settings.setValue("tv", false); QStringList keys = settings.childKeys(); // keys: ["sofa", "tv"]
如果使用beginGroup() 设置了一个组,则会返回该组中的顶级键,但不包括组前缀:
settings.beginGroup("fridge"); keys = settings.childKeys(); // keys: ["color", "size"]
使用 childKeys() 和childGroups() 可以递归浏览整个设置层次。
另请参阅 childGroups() 和allKeys()。
void QSettings::clear()
删除与QSettings 对象关联的主位置中的所有条目。
不会删除后备位置中的条目。
如果只想删除当前group() 中的条目,请使用 remove("") 代替。
另请参阅 remove() 和setFallbacksEnabled()。
bool QSettings::contains(QAnyStringView key) const
如果存在名为key 的设置,则返回true
;否则返回 false。
如果使用beginGroup() 设置了组,则key 将被视为相对于该组。
根据文件格式和操作系统的不同,键查找对大小写敏感或不敏感。为避免可移植性问题,请参阅Section and Key Syntax 规则。
注意: 在 6.4 之前的 Qt 版本中,此函数使用QString ,而非QAnyStringView 。
[static]
QSettings::Format QSettings::defaultFormat()
返回用于存储QSettings(QObject *) 构造函数设置的默认文件格式。如果未设置默认格式,则使用QSettings::NativeFormat 。
另请参阅 setDefaultFormat() 和format()。
void QSettings::endArray()
关闭使用beginReadArray() 或beginWriteArray() 启动的数组。
另请参阅 beginReadArray() 和beginWriteArray()。
void QSettings::endGroup()
将组重置为调用beginGroup() 之前的值。
举例说明:
settings.beginGroup("alpha"); // settings.group() == "alpha" settings.beginGroup("beta"); // settings.group() == "alpha/beta" settings.endGroup(); // settings.group() == "alpha" settings.endGroup(); // settings.group() == ""
另请参阅 beginGroup() 和group()。
[override virtual protected]
bool QSettings::event(QEvent *event)
重实现:QObject::event(QEvent *e)。
bool QSettings::fallbacksEnabled() const
如果启用了回退,则返回true
;否则返回false
。
默认情况下,回退已启用。
另请参见 setFallbacksEnabled().
QString QSettings::fileName() const
返回使用QSettings 对象写入的设置的存储路径。
在 Windows 系统中,如果格式为QSettings::NativeFormat ,则返回值为系统注册表路径,而不是文件路径。
另请参阅 isWritable() 和format()。
QSettings::Format QSettings::format() const
返回用于存储设置的格式。
另请参阅 defaultFormat()、fileName()、scope()、organizationName() 和applicationName()。
QString QSettings::group() const
返回当前分组。
另请参阅 beginGroup() 和endGroup()。
bool QSettings::isAtomicSyncRequired() const
如果QSettings 只允许执行设置的原子保存和重新加载(同步),则返回true
。如果允许将设置内容直接保存到配置文件,则返回false
。
默认值为true
。
另请参阅 setAtomicSyncRequired() 和QSaveFile 。
bool QSettings::isWritable() const
如果可以使用此QSettings 对象写入设置,则返回true
;否则返回false
。
isWritable()可能返回 false 的原因之一是QSettings 操作的是只读文件。
警告: 此函数并不完全可靠,因为文件权限可能随时发生变化。
另请参阅 fileName()、status() 和sync()。
QString QSettings::organizationName() const
返回用于存储设置的机构名称。
另请参阅 QCoreApplication::organizationName()、format()、scope() 和applicationName()。
[static]
QSettings::Format QSettings::registerFormat(const QString &extension, QSettings::ReadFunc readFunc, QSettings::WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive)
注册自定义存储格式。成功时,将返回一个特殊的格式值,然后将其传递给QSettings 构造函数。如果失败,则返回InvalidFormat 。
extension 是与格式相关的文件扩展名(不含".")。
readFunc 和writeFunc 参数是指向读写键/值对函数的指针。读写函数的QIODevice 参数始终以二进制模式打开(即不带QIODeviceBase::Text 标志)。
caseSensitivity 参数指定键是否区分大小写。这在使用QSettings 查找值时有区别。默认为区分大小写。在 Unix 系统上,该参数必须是Qt::CaseSensitive
。
默认情况下,如果使用以组织名称和应用程序名称为单位的构造函数,则使用的文件系统位置与IniFormat 相同。使用setPath() 可指定其他位置。
示例
bool readXmlFile(QIODevice &device, QSettings::SettingsMap &map); bool writeXmlFile(QIODevice &device, const QSettings::SettingsMap &map); int main(int argc, char *argv[]) { const QSettings::Format XmlFormat = QSettings::registerFormat("xml", readXmlFile, writeXmlFile); QSettings settings(XmlFormat, QSettings::UserScope, "MySoft", "Star Runner"); ... }
注意:此函数是线程安全的。
另请参阅 setPath()。
void QSettings::remove(QAnyStringView key)
删除设置key 和key 的任何子设置。
示例
QSettings settings; settings.setValue("ape"); settings.setValue("monkey", 1); settings.setValue("monkey/sea", 2); settings.setValue("monkey/doe", 4); settings.remove("monkey"); QStringList keys = settings.allKeys(); // keys: ["ape"]
请注意,如果某个后备位置包含具有相同键值的设置,那么调用 remove() 后,该设置仍将可见。
如果key 是空字符串,当前group() 中的所有键都会被移除。例如
QSettings settings; settings.setValue("ape"); settings.setValue("monkey", 1); settings.setValue("monkey/sea", 2); settings.setValue("monkey/doe", 4); settings.beginGroup("monkey"); settings.remove(""); settings.endGroup(); QStringList keys = settings.allKeys(); // keys: ["ape"]
根据文件格式和操作系统的不同,键查找对大小写敏感或不敏感。为避免可移植性问题,请参阅Section and Key Syntax 规则。
注意: 在 6.4 之前的 Qt 版本中,此函数使用QString ,而不是QAnyStringView 。
另请参阅 setValue()、value() 和contains()。
QSettings::Scope QSettings::scope() const
返回用于存储设置的作用域。
另请参阅 format()、organizationName() 和applicationName()。
void QSettings::setArrayIndex(int i)
将当前数组索引设置为i 。调用setValue() 、value() 、remove() 和contains() 等函数时,将对该索引处的数组条目执行操作。
必须先调用beginReadArray() 或beginWriteArray() 才能调用此函数。
void QSettings::setAtomicSyncRequired(bool enable)
配置是否要求QSettings 执行原子保存和重新加载(同步)设置。如果enable 参数为true
(默认值),sync() 将只执行原子同步操作。如果无法做到这一点,sync() 将失败,而status() 将成为错误条件。
将此属性设置为false
将允许QSettings 直接写入配置文件,并忽略任何试图锁定它以防止其他进程同时试图写入的错误。由于该选项可能会造成损坏,因此应谨慎使用,但在某些情况下,如QSettings::IniFormat 配置文件存在于其他不可写目录或 NTFS 备用数据流中,则需要使用该选项。
有关该功能的更多信息,请参阅QSaveFile 。
另请参阅 isAtomicSyncRequired() 和QSaveFile 。
[static]
void QSettings::setDefaultFormat(QSettings::Format format)
将默认文件格式设置为给定的format ,用于存储QSettings(QObject *) 构造函数的设置。
如果未设置默认格式,则使用QSettings::NativeFormat 。请参阅QSettings 构造函数的文档,了解该构造函数是否会忽略此函数。
另请参阅 defaultFormat() 和format()。
void QSettings::setFallbacksEnabled(bool b)
设置是否启用回退到b 。
默认情况下,回退已启用。
另请参阅 fallbacksEnabled() 。
[static]
void QSettings::setPath(QSettings::Format format, QSettings::Scope scope, const QString &path)
将用于存储给定format 和scope 设置的路径设置为path 。format 可以是自定义格式。
下表总结了默认值:
平台 | 格式 | 范围 | 路径 |
---|---|---|---|
Windows | IniFormat | UserScope | FOLDERID_RoamingAppData |
SystemScope | FOLDERID_ProgramData | ||
Unix | NativeFormat,IniFormat | UserScope | $HOME/.config |
SystemScope | /etc/xdg | ||
macOS 和 iOS | IniFormat | UserScope | $HOME/.config |
SystemScope | /etc/xdg |
用户可以通过设置XDG_CONFIG_HOME
环境变量来覆盖 Unix、macOS 和 iOS 上默认的UserScope 路径($HOME/.config
或 $HOME/Settings)。Unix、macOS 和 iOS 上的默认SystemScope 路径 (/etc/xdg
) 可在构建 Qt XML 库时使用configure
脚本的-sysconfdir
标志覆盖(详情请参见QLibraryInfo )。
在 Windows、macOS 和 iOS 上设置NativeFormat 路径没有影响。
警告: 此函数不会影响现有的QSettings 对象。
另请参阅 registerFormat()。
void QSettings::setValue(QAnyStringView key, const QVariant &value)
将设置key 的值设置为value 。如果key 已经存在,先前的值将被覆盖。
根据文件格式和操作系统的不同,键查找对大小写敏感或不敏感。为避免出现可移植性问题,请参阅Section and Key Syntax 规则。
举例说明
QSettings settings; settings.setValue("interval", 30); settings.value("interval").toInt(); // returns 30 settings.setValue("interval", 6.55); settings.value("interval").toDouble(); // returns 6.55
注意: 在 6.4 之前的 Qt XML 版本中,此函数使用QString ,而不是QAnyStringView 。
另请参阅 value()、remove() 和contains()。
QSettings::Status QSettings::status() const
返回一个状态代码,表示QSettings 遇到的第一个错误,如果没有发生错误,则返回QSettings::NoError 。
请注意,QSettings 会延迟执行某些操作。因此,在调用 status() 之前,您可能需要调用sync() 以确保存储在QSettings 中的数据已写入磁盘。
另请参阅 sync()。
void QSettings::sync()
将任何未保存的更改写入永久存储,并重新加载在此期间被其他应用程序更改的任何设置。
QSettings 的析构函数会自动调用该函数,事件循环也会定期调用该函数,因此通常不需要自己调用。
另请参阅 status()。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.