QSettings 类

QSettings类提供持久的平台无关的应用程序设置。更多...

头文件 #include <QSettings>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
继承 QObject

注意:此类中所有函数都是可重入的。

注意:这些函数也是线程安全的

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

公共类型

枚举Format { NativeFormat, Registry32Format, Registry64Format, IniFormat, WebLocalStorageFormat, …, InvalidFormat }
ReadFunc
枚举Scope { UserScope, SystemScope }
SettingsMap
枚举Status { NoError, AccessError, FormatError }
WriteFunc

公共函数

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)
QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr)
QSettings(QObject *parent = nullptr)
QSettings(QSettings::Scope scope, QObject *parent = nullptr)
虚拟~QSettings()
QStringListallKeys() const
QStringapplicationName() const
voidbeginGroup(QAnyStringView prefix)
intbeginReadArray(QAnyStringView prefix)
voidbeginWriteArray(QAnyStringView prefix, int size = -1)
QStringListchildGroups() const
QStringListchildKeys() const
voidclear()
boolcontains(QAnyStringView key) const
voidendArray()
voidendGroup()
boolfallbacksEnabled() const
QStringfileName() const
QSettings::Formatformat() const
QStringgroup() const
boolisAtomicSyncRequired() const
boolisWritable() const
QStringorganizationName() const
voidremove(QAnyStringView key)
QSettings::Scopescope() const
voidsetArrayIndex(int i)
voidsetAtomicSyncRequired(bool enable)
voidsetFallbacksEnabled(bool b)
voidsetValue(QAnyStringView key, const QVariant &value)
QSettings::Statusstatus() const
voidsync()
QVariantvalue(QAnyStringView key, const QVariant &defaultValue) const
QVariantvalue(QAnyStringView key) const

静态公共成员

QSettings::Format默认格式()
QSettings::FormatregisterFormat(const QString &extension, QSettings::ReadFunc readFunc, QSettings::WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive)
voidsetDefaultFormat(QSettings::Format format)
voidsetPath(QSettings::Format format, QSettings::Scope scope, const QString &path)

重写的受保护函数

虚拟boolevent(QEvent *event) override

详细信息

用户通常期望应用程序能够在会话之间记住其设置(窗口大小和位置、选项等)。这些信息通常存储在Windows的系统注册表中,以及macOS和iOS的属性列表文件中。在Unix系统上,在没有标准的情况下,许多应用程序(包括KDE应用程序)使用INI文本文件。

QSettings是围绕这些技术的抽象,使您能够以可移植的方式保存和恢复应用程序设置。它还支持自定义存储格式

QSettings的API基于QVariant,允许您以最小的努力保存大多数基于值的类型,例如QStringQRectQImage

如果您只需要一个非持久性内存中的结构,请考虑使用QMap<QString, QVariant>代替。

基本用法

在创建QSettings对象时,您必须传递您公司的名称或组织的名称以及您应用程序的名称。例如,如果您的产品称为星帆,您的工作室名称为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;

(在此,我们还需要指定组织的互联网域名。当设置互联网域名后,在 macOS 和 iOS 上将使用域名而不是组织名称,因为 macOS 和 iOS 应用程序通常使用互联网域名来标识自身。如果没有设置域名,将根据组织名称派生出一个假域名。有关详细信息,请参阅下面的平台特定说明。)

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 核心模块的一部分,它不能提供转换到数据类型如 QColorQImageQPixmap(它们是 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 文件使用不区分大小写的键,而 macOS 和 iOS 上的 CFPreferences API 使用区分大小写的键。为了避免可移植性问题,请遵循以下简单规则

  1. 始终使用相同的大小写引用相同的键。例如,如果在一个代码位置中将键称为 "text fonts",那么在其他地方不要将其称为 "Text Fonts"。
  2. 避免键名仅在大小写上不同。例如,如果您有一个键 called "MainWindow",那么不要尝试保存另一个键为 "mainwindow"。
  3. 不要在部分或键名称中使用斜杠('/' 和 '\');反斜杠字符用于分隔子键(见下文)。在 Windows 上,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。当您查找一个值时,将按照以下顺序在该对象中搜索最多四个位置:

  1. Star Runner应用程序的用户特定位置
  2. MySoft所有应用程序的用户特定位置
  3. Star Runner应用程序的系统全局位置
  4. MySoft所有应用程序的系统全局位置

(有关Qt支持的各个平台上的这些位置的信息,请参阅下方的平台特定说明。)

如果找不到第一个位置中的键,则搜索将转到第二个位置,依此类推。这使您能够存储系统级或组织级的设置,并同时覆盖基于用户或应用程序的设置。要关闭此机制,请调用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”表示该位置在读取时用作回退。

位置obj1obj2obj3obj4
1. 用户,应用程序X
2. 用户,组织oX
3. 系统,应用程序oX
4. 系统,组织oooX

此机制的优点在于它适用于Qt支持的所有平台,并且仍然提供了很多灵活性,而无需您指定任何文件名或注册表路径。

如果您想在所有平台上使用INI文件而不是本地API,可以在QSettings构造函数中传递QSettings::IniFormat作为第一个参数,然后是作用域、组织名称和应用程序名称

    QSettings settings(QSettings::IniFormat, QSettings::UserScope,
                       "MySoft", "Star Runner");

请注意,INI文件遗失了数字数据及其编码字符串之间的区别,因此写入数字的值将按QString读取。可以使用QString::toInt()、QString::toDouble()和相关的函数来恢复数字值。

恢复GUI应用程序的状态

QSettings通常用于存储GUI应用程序的状态。以下示例演示了如何使用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 的更改外,还导入其他进程(如步骤)所做的更改。

特定于平台的说明

应用程序设置存储的位置

回退机制部分所述,QSettings 根据设置是针对用户特定还是全局以及是特定于应用程序还是全局的,最多在四个位置存储应用程序的设置。为了简单起见,我们假定组织名称为 MySoft,应用程序名称为 Star Runner。

在 Unix 系统上,如果文件格式为 NativeFormat,则默认使用以下文件

  1. $HOME/.config/MySoft/Star Runner.conf
  2. $HOME/.config/MySoft.conf
  3. 对于 $XDG_CONFIG_DIRS 中的每个目录 <dir>:<dir>/MySoft/Star Runner.conf
  4. 对于 $XDG_CONFIG_DIRS 中的每个目录 <dir>:<dir>/MySoft.conf

注意:如果未设置 XDG_CONFIG_DIRS,则使用默认值 /etc/xdg

在 macOS 和 iOS 上,如果文件格式为 NativeFormat,则默认使用以下文件

  1. $HOME/Library/Preferences/com.MySoft.Star Runner.plist
  2. $HOME/Library/Preferences/com.MySoft.plist
  3. /Library/Preferences/com.MySoft.Star Runner.plist
  4. /Library/Preferences/com.MySoft.plist

在 Windows 上,NativeFormat 设置存储在以下注册表路径中

  1. HKEY_CURRENT_USER\Software\MySoft\Star Runner
  2. HKEY_CURRENT_USER\Software\MySoft\OrganizationDefaults
  3. HKEY_LOCAL_MACHINE\Software\MySoft\Star Runner
  4. HKEY_LOCAL_MACHINE\Software\MySoft\OrganizationDefaults

注意:在 Windows 上,对于在 WOW64 模式下运行的 32 位程序,设置存储在以下注册表路径中:HKEY_LOCAL_MACHINE\Software\WOW6432node

如果文件格式是 NativeFormat,则在应用程序的 home 目录中为 "Settings/MySoft/Star Runner.conf"。

如果文件格式是 IniFormat,则在 Unix、macOS 和 iOS 上使用以下文件

  1. $HOME/.config/MySoft/Star Runner.ini
  2. $HOME/.config/MySoft.ini
  3. 对于 $XDG_CONFIG_DIRS 中的每个目录 <dir>:<dir>/MySoft/Star Runner.ini
  4. 对于 $XDG_CONFIG_DIRS 中的每个目录 <dir>:<dir>/MySoft.ini

注意:如果未设置 XDG_CONFIG_DIRS,则使用默认值 /etc/xdg

在 Windows 上,使用以下文件

  1. FOLDERID_RoamingAppData\MySoft\Star Runner.ini
  2. FOLDERID_RoamingAppData\MySoft.ini
  3. FOLDERID_ProgramData\MySoft\Star Runner.ini
  4. FOLDERID_ProgramData\MySoft.ini

FOLDERID_为前缀的标识符是特殊的项ID列表,用于传递给Win32 API函数SHGetKnownFolderPath()以获取相应的路径。

FOLDERID_RoamingAppData通常指向C:\Users\用户名\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 settings("/home/petra/misc/myapp.ini",
                   QSettings::IniFormat);

然后您可以使用QSettings对象来读取和写入文件中的设置。

在macOS和iOS上,您可以通过将QSettings::NativeFormat作为第二个参数传递来访问属性列表.plist文件。例如

QSettings settings("/Users/petra/misc/myapp.plist",
                   QSettings::NativeFormat);

直接访问Windows注册表

在Windows上,QSettings允许您访问使用QSettings(或支持格式的设置,例如字符串数据)写入系统注册表的设置。这是通过使用注册表路径和QSettings::NativeFormat构造QSettings对象来实现的。

例如

QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Office",
                   QSettings::NativeFormat);

在指定路径下出现的所有注册表条目都可以通过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 构造函数。另一种解决方案是使用预处理指令,例如
    #ifdef Q_OS_DARWIN
        QSettings settings("grenoullelogique.fr", "Squash");
    #else
        QSettings settings("Grenoulle Logique", "Squash");
    #endif
  • 在 macOS 上,访问不属于当前用户设置(即 SystemScope)的权限在 10.7(Lion)中发生了变化。在那个版本之前,有管理员权限的用户可以访问这些设置。对于 10.7 和 10.8(Mountain Lion),只有 root 可以。然而,10.9(Mavericks)再次改变了这一规则,但只适用于原生格式(plist 文件)。

另请参阅QVariantQSessionManager

成员类型文档

enum QSettings::Format

此枚举类型指定了 QSettings 使用的存储格式。

常量描述
QSettings::NativeFormat0使用平台最合适的存储格式来存储设置。在 Windows 上,这意味着系统注册表;在 macOS 和 iOS 上,这意味着 CFPreferences API;在 Unix 上,这意味着 INI 格式的文本配置文件。
QSettings::Registry32Format2仅限 Windows:从运行在 64 位 Windows 上的 64 位应用程序中显式访问 32 位系统注册表。在 32 位 Windows 或从 32 位应用程序上,这与指定 NativeFormat 的工作方式相同。此枚举值是在 Qt 5.7 中添加的。
QSettings::Registry64Format3仅限 Windows:从运行在 64 位 Windows 上的 32 位应用程序中显式访问 64 位系统注册表。在 32 位 Windows 或从 64 位应用程序上,这与指定 NativeFormat 的工作方式相同。此枚举值是在 Qt 5.7 中添加的。
QSettings::IniFormat1将设置存储在 INI 文件中。请注意,INI 文件丢失了数字数据与其用于编码的字符串之间的区别,所以以数字编写的值在读取时应作为 QString
QSettings::WebLocalStorageFormat4仅限 WASM:将设置存储在当前来源的 window.localStorage 中。如果不允许 cookie,则回退到 INI 格式。这提供了每个来源高达 5MiB 的存储空间,但对其访问是同步的,而且不需要 JSPI。
QSettings::WebIndexedDBFormat5仅限 WASM:将设置存储在当前来源的 Indexed DB 中。如果不允许 cookie,则回退到 INI 格式。这需要 JSPI,但比 WebLocalStorageFormat 提供更多的存储空间。
QSettings::InvalidFormat16registerFormat() 返回的特殊值。

在 Unix 上,NativeFormat 和 IniFormat 表示相同的意思,只是文件扩展名不同(NativeFormat 是 .conf,IniFormat 是 .ini)。

INI 文件格式是一种 Windows 文件格式,Qt 在所有平台上都支持。在没有 INI 标准时,我们尽量按照 Microsoft 所做的来操作,但有以下例外

  • 如果您存储的类型QVariant无法转换成QString(例如QPointQRectQSize),Qt会使用基于@的语法来编码该类型。例如:
    pos = @Point(100 100)

    为了减少兼容性问题,任何不在值的第一位置出现或后面不是Qt类型(如Point、Rect、Size等)的@都被视为普通字符。

  • 尽管反斜杠在INI文件中是特殊字符,但大多数Windows应用程序都不会在文件路径中转义反斜杠(\
    windir = C:\Windows

    QSettings始终将反斜杠视为特殊字符,并提供没有API来读取或写入此类条目。

  • INI文件格式对键的语法有严格的限制。Qt通过在键中使用%作为转义字符来解决这个问题。此外,如果您保存顶级设置(没有斜线的键,例如"someKey"),它将出现在INI文件的"General"部分。为了避免覆盖其他键,如果您使用诸如"General/someKey"之类的键保存内容,键将位于"%General"部分,而不是"General"部分。
  • 与当今的大多数实现一致,QSettings假定INI文件中的值是utf-8编码的。这意味着值将被解码为utf-8编码的条目,并以utf-8写入。为了与较老版本的Qt保持向下兼容,INI文件中的键以%-encoded格式写入,但可以以%-encoded和utf-8格式读取。
与旧版Qt版本的兼容性

请注意,这种行为与Qt 6之前的版本的QSettings的行为不同。但用Qt 5或更早版本编写的INI文件可以被基于Qt 6的应用程序完全读出(除非设置了与utf8不同的ini codec)。然而,用Qt 6编写的INI文件只有在您将"iniCodec"设置为utf-8 textcodec时才能被较旧的Qt版本读出。

另请参阅registerFormat() 和 setPath

QSettings::ReadFunc

指向具有以下签名的函数的指针的类型定义

bool myReadFunc(QIODevice &device, QSettings::SettingsMap &map);

ReadFuncregisterFormat()中用作读取一组键值对的函数的指针。ReadFunc应读取一次所有选项,并将所有设置返回到最初为空的SettingsMap容器中。

另请参阅WriteFuncregisterFormat

enum QSettings::Scope

此枚举指定设置是针对用户特定还是所有同一系统的用户共享的。

常量描述
QSettings::UserScope0在当前用户特定的位置存储设置(例如,在用户的家目录中)。
QSettings::SystemScope1在全局位置存储设置,以便在同一台机器上的所有用户访问相同的设置集。

另请参阅setPath

QSettings::SettingsMap

指向QMap<QString, QVariant>的类型定义。

另请参阅registerFormat

枚举 QSettings::Status

以下是可能的状态值:

常量描述
QSettings::NoError0没有发生错误。
QSettings::AccessError1发生访问错误(例如尝试写入只读文件)。
QSettings::FormatError2发生格式错误(例如加载格式不正确的 INI 文件)。

另请参阅状态

QSettings::WriteFunc

指向具有以下签名的函数的指针的类型定义

bool myWriteFunc(QIODevice &device, const QSettings::SettingsMap &map);

WriteFuncregisterFormat() 中作为指向写入一组键/值对的函数的指针使用。 WriteFunc 只调用一次,因此您需要一次性输出设置。

另请参阅ReadFuncregisterFormat

成员函数文档

QVariant QSettings::value(QAnyStringView key) const

QVariant QSettings::value(QAnyStringView key, const QVariant &defaultValue) const

返回设置 key 的值。如果设置不存在,则返回 defaultValue

如果没有指定默认值,则返回默认 QVariant

请注意,Windows 注册表和 INI 文件使用不区分大小写的键,而 macOS 和 iOS 的 CFPreferences API 使用区分大小写的键。为了防止可移植性问题,请参阅 部分和键语法 规则。

示例

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

注意:在 Qt 6.4 之前的版本中,此函数接受 QString,而不是 QAnyStringView

另请参阅setValue(), contains() 和 remove()。

[显式] 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() 和 回退机制

QSettings::QSettings(QSettings::Scope scope, const QString &organization, const QString &application = QString(), QObject *parent = nullptr)

构建一个 QSettings 对象,用于访问名为 application 的应用程序的设置,来自名为 organization 的组织,并具有父 parent

如果 scopeQSettings::UserScope,则 QSettings 对象首先搜索用户特定的设置,然后再搜索系统范围的设置作为后备。如果 scopeQSettings::SystemScope,则 QSettings 对象忽略用户特定的设置并提供对系统范围的设置的访问。

存储格式被设置为 QSettings::NativeFormat(即,在调用此构造函数之前调用 setDefaultFormat() 没有作用)。

如果没有提供应用程序名称,QSettings 对象将只访问组织内的 位置

另请参阅:setDefaultFormat

QSettings::QSettings(QSettings::Format format, QSettings::Scope scope, const QString &organization, const QString &application = QString(), QObject *parent = nullptr)

构建一个 QSettings 对象,用于访问名为 application 的应用程序的设置,来自名为 organization 的组织,并具有父 parent

如果 scopeQSettings::UserScope,则 QSettings 对象首先搜索用户特定的设置,然后再搜索系统范围的设置作为后备。如果 scopeQSettings::SystemScope,则 QSettings 对象忽略用户特定的设置并提供对系统范围的设置的访问。

如果 formatQSettings::NativeFormat,则用于存储设置的会使用本地 API。如果 formatQSettings::IniFormat,则使用 INI 格式。

如果没有提供应用程序名称,QSettings 对象将只访问组织内的 位置

QSettings::QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr)

用于创建一个 QSettings 对象,该对象可访问由 fileName 命名的文件中存储的设置,并具有父对象 parent。如果文件不存在,则创建该文件。

如果 formatQSettings::NativeFormat,则 fileName 的含义取决于平台。在 Unix 上,fileName 是 INI 文件名。在 macOS 和 iOS 上,fileName.plist 文件的名称。在 Windows 上,fileName 是系统注册表中的路径。

如果 formatQSettings::IniFormat,则 fileName 是 INI 文件的名称。

注意:此函数仅提供方便。对于由 Qt 生成的 INI 或 .plist 文件,此函数运行良好,但对于某些由其他程序创建的文件中的语法,可能会失败。特别是,请注意以下限制

  • QSettings 不提供读取 INI "路径" 条目的方式,即使用转义斜杠字符的条目。(这是因为这些条目是歧义的,不能自动解析。)
  • 在一些情况下,QSettings 将使用 @ 字符作为元字符,来说明 Qt 特定的数据类型(例如,@Rect),因此可能会在纯 INI 文件中错误地解释它。

另请参阅:fileName

[显式] 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

[显式] QSettings::QSettings(QSettings::Scope scope, QObject *parent = nullptr)

以与 QSettings(QObject *parent) 相同的方式构造 QSettings 对象,但带有给定的 scope

另请参阅 QSettings(QObject *parent).

[虚,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() 调用之前的值。组可以嵌套。

注意:在 Qt 6.4 之前的版本中,此函数接受 QString,而不是 QAnyStringView

另请参阅 endGroup() 和 group

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()在第一个位置写入数组。

注意:在 Qt 6.4 之前的版本中,此函数接受 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()。

注意:在 Qt 6.4 之前的版本中,此函数接受 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() 在所有设置层次结构中进行导航。

另请参阅 childKeys() 和 allKeys()。

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被认为是相对于该组。

请注意,Windows 注册表和 INI 文件使用不区分大小写的键,而 macOS 和 iOS 的 CFPreferences API 使用区分大小写的键。为了防止可移植性问题,请参阅 部分和键语法 规则。

注意:在 Qt 6.4 之前的版本中,此函数接受 QString,而不是 QAnyStringView

另请参阅 value() 和 setValue()。

[静态] 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

[重写虚保护] 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::organizationNameformatscopeapplicationName

[静态] QSettings::Format QSettings::registerFormat(const QString &extension, QSettings::ReadFunc readFunc, QSettings::WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive)

注册一个自定义存储格式。成功时返回一个特殊格式的值,然后可以将此值传递给 QSettings 构造函数。失败时返回 InvalidFormat

extension 是与格式关联的文件扩展名(不带'.')。

readFuncwriteFunc 参数是指向函数的指针,用于读取和写入一组键/值对。读取和写入函数中的 QIODevice 参数总是以二进制模式打开(即不带 QIODevice::Text 标志)。

caseSensitivity 参数指定键是否区分大小写。当使用 QSettings 查找值时,这很重要。默认是区分大小写。

默认情况下,如果您使用基于机构名称和应用程序名称的构造函数之一,所使用的文件系统位置与 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)

删除设置 keykey 的任何子设置。

示例

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"]

请注意,Windows 注册表和 INI 文件使用不区分大小写的键,而 macOS 和 iOS 的 CFPreferences API 使用区分大小写的键。为了防止可移植性问题,请参阅 部分和键语法 规则。

注意:在 Qt 6.4 之前的版本中,此函数接受 QString,而不是 QAnyStringView

另请参阅:setValuevaluecontains

QSettings::Scope QSettings::scope() const

返回用于存储设置的域。

另请参阅:formatorganizationNameapplicationName

void QSettings::setArrayIndex(int i)

将当前数组索引设置为 i。对setValue(),value(),removecontains()等函数的调用将作用在该索引处的数组条目。

在调用此函数之前,你必须先调用beginReadArray()或beginWriteArray()。

void QSettings::setAtomicSyncRequired(bool enable)

配置是否需要使用原子保存和重新加载(同步)设置。如果enable参数为true(默认值),sync()将仅执行原子同步操作。如果无法这样做,sync()将失败,并且status()将为错误条件。

将此属性设置为false将允许QSettings直接写入配置文件并忽略尝试同时写入该文件的其他进程的任何锁定错误。由于存在损坏的潜在风险,这种选项应谨慎使用,但在某些条件下是必需的,例如一个存在于非可写目录中的QSettings::IniFormat配置文件或NTFS备用数据流。

有关此功能的更多信息,请参阅QSaveFile

另请参阅isAtomicSyncRequired()和QSaveFile

[静态] void QSettings::setDefaultFormat(QSettings::Format format)

将默认文件格式设置为指定的format,该格式用于存储用于QSettings(QObject *)构造函数的设置。

如果没有设置默认格式,则使用NativeFormat。请参阅您正在使用的QSettings构造函数的文档,以查看该构造函数是否会忽略此函数。

另请参阅defaultFormat()和format

void QSettings::setFallbacksEnabled(bool b)

将回退启用设置设置为b

默认情况下,回退是启用的。

另请参阅fallbacksEnabled

[静态] void QSettings::setPath(QSettings::Format format, QSettings::Scope scope, const QString &path)

设置用于存储formatscope设置的路径为path。其中format可以是自定义格式。

下表总结了默认值

平台格式范围路径
WindowsIniFormatUserScopeFOLDERID_RoamingAppData
SystemScopeFOLDERID_ProgramData
UnixNativeFormatIniFormatUserScope$HOME/.config
SystemScope/etc/xdg
macOS和iOSIniFormatUserScope$HOME/.config
SystemScope/etc/xdg

Unix、macOS 和 iOS 上默认的 UserScope 路径($HOME/.config 或 $HOME/Settings)可以通过设置环境变量 XDG_CONFIG_HOME 来覆盖。Unix、macOS 和 iOS 上默认的 SystemScope 路径(/etc/xdg)在构建 Qt 库时可以通过 configure 脚本的 -sysconfdir 标志来覆盖(详情见 QLibraryInfo)。

在 Windows、macOS 和 iOS 上设置 NativeFormat 路径没有任何效果。

警告:此功能不会影响现有的 QSettings 对象。

另请参阅registerFormat

void QSettings::setValue(QAnyStringView key, const QVariant &value)

key 的设置值设为 value。如果 key 已存在,则覆盖其之前的值。

请注意,Windows 注册表和 INI 文件使用不区分大小写的键,而 macOS 和 iOS 的 CFPreferences API 使用区分大小写的键。为了防止可移植性问题,请参阅 部分和键语法 规则。

示例

QSettings settings;
settings.setValue("interval", 30);
settings.value("interval").toInt();     // returns 30

settings.setValue("interval", 6.55);
settings.value("interval").toDouble();  // returns 6.55

注意:在 Qt 6.4 之前的版本中,此函数接受 QString,而不是 QAnyStringView

参见:value(),remove() 和 contains()。

QSettings::Status QSettings::status() const

返回一个状态代码,表示 QSettings 遇到的第一个错误,如果没有错误,则为 QSettings::NoError

请注意,QSettings 会延迟执行某些操作。因此,您可能需要调用 sync() 确保在调用 status() 之前,存放在 QSettings 中的数据已经写入到磁盘。

另请参阅 sync

void QSettings::sync()

将任何未保存的更改写入永久存储,并重新加载在此期间由其他应用程序更改的任何设置。

该函数会自动由 QSettings 的析构函数和事件循环在定期间隔中调用,所以通常您不需要自行调用它。

另请参阅状态

© 2024 The Qt Company Ltd. 本文档中包含的文档贡献是各自所有者的版权。本提供的文档是根据 Free Software Foundation 发布的 GNU Free Documentation License 1.3 版本 许可的。Qt 及相关商标是 The Qt Company Ltd. 在芬兰和/或其他国家的注册商标。所有其他商标均为其各自所有者的财产。