本页内容

QSettings Class

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

头文件: #include <QSettings>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
继承自: QObject

注意:该类中的所有函数均为可重入的。

注意:以下函数也具有线程安全性:

  • 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;

(在此,我们还指定了组织的互联网域名。当设置了互联网域名时,macOS 和 iOS 系统会优先使用该域名而非组织名称,因为 macOS 和 iOS 应用程序通常使用互联网域名来标识自身。如果未设置域名,系统会根据组织名称生成一个虚拟域名。详情请参阅下文的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 = QColor(Qt::blue);
settings.setValue("DataPump/bgcolor", color);

使用qRegisterMetaType() 注册的自定义类型,只要具备与QDataStream 之间进行流式数据传输的运算符,即可通过 QSettings 进行存储。

部分和键的语法

设置键可以包含任何 Unicode 字符。文件格式和操作系统将决定它们是否区分大小写。在 Windows 上,注册表和 INI 文件将使用不区分大小写的键,而通过registerFormat() 注册的用户自定义格式则可能区分或不区分大小写。在 Unix 系统上,键始终区分大小写。

为避免可移植性问题,请遵循以下简单规则:

  1. 始终使用相同的大小写形式来引用同一个键。例如,如果代码中某处将某个键称为“text fonts”,则不要在其他地方将其称为“Text Fonts”。
  2. 避免使用除大小写外完全相同的键名。例如,如果你有一个名为“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 支持的不同平台上的具体信息,请参阅下文的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”表示该位置在读取时用作备用位置。

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

该机制的优势在于:它适用于 Qt 支持的所有平台,同时仍能为您提供极大的灵活性,且无需您指定任何文件名或注册表路径。

若您希望在所有平台上使用 INI 文件而非原生 API,可将 `QSettings::IniFormat ` 作为 QSettings 构造函数的第一个参数,随后依次传入作用域、组织名称和应用程序名称:

    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 中的更改,还会导入其他进程所做的更改。

平台特定注意事项

应用程序设置的存储位置

如“Fallback Mechanism ”一节所述,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 ,则位于应用程序主目录下的“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\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::IniFormat ` 作为第二个参数传递的 QSettings 构造函数。例如:

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 文件)。

安全注意事项

该类使用QDataStream 将数据反序列化为QVariant 。因此,它具有相同的security consideration as QDataStream ,仅应用于可信输入。

另请参阅 QVariant 和QSessionManager 。

成员类型文档

enum QSettings::Format

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

常量值描述
QSettings::NativeFormat0使用最适合该平台的存储格式存储设置。在 Windows 上,这意味着系统注册表;在 macOS 和 iOS 上,这意味着 CFPreferences API;在 Unix 上,这意味着 INI 格式的文本配置文件。
QSettings::Registry32Format2仅限 Windows:从运行在 64 位 Windows 上的 64 位应用程序中显式访问 32 位系统注册表。 在 32 位 Windows 系统上,或在 64 位 Windows 系统上的 32 位应用程序中,此操作的效果与指定 NativeFormat 相同。此枚举值在 Qt 5.7 中新增。
QSettings::Registry64Format3仅限 Windows:从运行在 64 位 Windows 上的 32 位应用程序中显式访问 64 位系统注册表。 在 32 位 Windows 系统上,或在 64 位 Windows 系统上的 64 位应用程序中,此行为与指定 NativeFormat 相同。该枚举值在 Qt 5.7 中新增。
QSettings::IniFormat1将设置存储在 INI 文件中。请注意,INI 文件无法区分数值数据与其编码所用的字符串,因此以数字形式写入的值在读取时将被解释为 `QString`。
QSettings::WebLocalStorageFormat4仅限 WASM:将设置存储在当前源的 window.localStorage 中。如果不允许使用 Cookie,则会回退到 INI 格式。此方式为每个源提供最多 5MiB 的存储空间,但访问是同步的,且不需要 JSPI。
QSettings::WebIndexedDBFormat5仅限 WASM:将设置存储在当前源的索引数据库(IndexedDB)中。如果不允许使用 Cookie,则回退到 INI 格式。此方法需要 JSPI,但提供的存储空间比 WebLocalStorageFormat 更大。
QSettings::InvalidFormat16由 `registerFormat()` 返回的特殊值。

在 Unix 系统上,NativeFormat 和 IniFormat 含义相同,仅文件扩展名不同(NativeFormat 为.conf ,IniFormat 为.ini )。

INI 文件格式是一种 Windows 文件格式,Qt 在所有平台上均支持该格式。由于缺乏 INI 标准,我们尽量遵循 Microsoft 的做法,但有以下例外:

  • 如果您存储的类型无法由QVariant 转换为QString (例如,QPoint 、QRect 和QSize ),Qt 将使用基于@ 的语法来编码该类型。例如:
    pos = @QPoint(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 文件中的键以 % 编码格式写入,但可以以 % 编码和 UTF-8 两种格式读取。
与旧版 Qt 的兼容性

请注意,此行为与 Qt 6 之前的 Qt 版本中 `QSettings ` 的行为不同。不过,使用 Qt 5 或更早版本编写的 INI 文件仍可被基于 Qt 6 的应用程序完全读取(除非设置了与 utf8 不同的 ini 编解码器)。 但若将“iniCodec”设置为 UTF-8 文本编解码器,则使用 Qt 6 生成的 INI 文件才能被旧版 Qt 读取。

另请参阅 registerFormat() 和setPath()。

QSettings::ReadFunc

用于定义具有以下签名的函数指针的typedef:

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

ReadFunc 在 `registerFormat() ` 中用作读取一组键值对的函数指针。`ReadFunc ` 应在一遍遍读中读取所有选项,并将所有设置返回至 `SettingsMap ` 容器中,该容器初始为空。

另请参阅 WriteFunc 和registerFormat()。

enum QSettings::Scope

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

常量值描述
QSettings::UserScope0将设置存储在当前用户专用的位置(例如,用户的 home 目录中)。
QSettings::SystemScope1将设置存储在全局位置,以便同一台机器上的所有用户都能访问同一组设置。

另请参阅 setPath()。

QSettings::SettingsMap

QMap 的typedef定义 <QString,QVariant>。

另请参阅 registerFormat()。

enum QSettings::Status

可能的状态值如下:

常量值描述
QSettings::NoError0未发生错误。
QSettings::AccessError1发生访问错误(例如:尝试向只读文件写入数据)。
QSettings::FormatError2发生格式错误(例如:加载格式错误的 INI 文件)。

另请参阅 status()。

QSettings::WriteFunc

用于指代具有以下签名函数的指针的typedef:

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

WriteFunc 在registerFormat() 中,该类型定义被用作指向一个写入一组键值对的函数的指针。WriteFunc 仅被调用一次,因此你需要一次性输出所有设置。

另请参阅 ReadFunc 和registerFormat()。

成员函数文档

[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(QObject *parent) 相同的方式构建一个 QSettings 对象,但使用给定的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 生成的 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 对象,用于访问名为application 的应用程序的设置,该应用程序所属的组织名为organization ,且父组织为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 对象,用于访问名为application 的应用程序的设置,该应用程序所属的组织名为organization ,且父组织为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("active", win->isActive());
settings.endGroup();

settings.beginGroup("outputpanel");
settings.setValue("visible", panel->isVisible());
settings.endGroup();

这将设置三个配置项的值:

  • mainwindow/size
  • mainwindow/active
  • 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;
//...
void some_function()
{
    //...
    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;
//...
void some_function()
{
    //...
    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 将被视为相对于该组。

键的查找是否区分大小写取决于文件格式和操作系统。为避免可移植性问题,请参阅Section and Key Syntax 的规则。

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

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

[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)

注册自定义存储格式。成功时,返回一个特殊的 Format 值,该值随后可传递给 `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", 0);
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", 0);
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 的规则。

注意:在 Qt 6.4 之前的版本中,此函数接受 `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 可以是自定义格式。

下表总结了默认值:

平台格式作用域路径
WindowsIniFormatUserScopeFOLDERID_RoamingAppData
SystemScopeFOLDERID_ProgramData
UnixNativeFormat,IniFormatUserScope$HOME/.config ($XDG_CONFIG_HOME)
SystemScope/etc/xdg
macOSIniFormatUserScope$HOME/.config ($XDG_CONFIG_HOME)
SystemScope/Library/Preferences/Qt
iOSIniFormatUserScope$HOME/Library/Preferences
SystemScope/Library/Preferences/Qt
macOS 和 iOSNativeFormatUserScope$HOME/Library/Preferences
SystemScope/Library/Preferences

在构建 Qt 时,可以通过向configure 脚本传递-sysconfdir 来覆盖默认的SystemScope 路径(详情请参阅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

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

另请参阅 value()、remove() 和contains()。

QSettings::Status QSettings::status() const

返回一个状态码,该状态码表示QSettings 遇到的第一个错误;如果未发生错误,则返回QSettings::NoError 。

请注意,QSettings 会延迟执行某些操作。因此,在调用 status() 之前,建议先调用sync(),以确保QSettings 中存储的数据已写入磁盘。

另请参阅 sync()。

void QSettings::sync()

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

该函数会由QSettings 的析构函数自动调用,并由事件循环以固定间隔调用,因此通常无需手动调用。

另请参阅 status()。

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

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

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

© 2026 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.