161- 文件读取补充-持久化设置QSettings

持久化设置QSettings

QSettings提供持久的platform-independent应用程序设置。

from PySide6.QtCore import QSettings

QSettings(fileName: str, format: PySide6.QtCore.QSettings.Format, parent: Union[PySide6.QtCore.QObject, NoneType] = None) -> None
QSettings(format: PySide6.QtCore.QSettings.Format, scope: PySide6.QtCore.QSettings.Scope, organization: str, application: str = '', parent: Union[PySide6.QtCore.QObject, NoneType] = None) -> None
QSettings(organization: str, application: str = '', parent: Union[PySide6.QtCore.QObject, NoneType] = None) -> None
QSettings(parent: Union[PySide6.QtCore.QObject, NoneType] = None) -> None
QSettings(scope: PySide6.QtCore.QSettings.Scope, organization: str, application: str = '', parent: Union[PySide6.QtCore.QObject, NoneType] = None) -> None
QSettings(scope: PySide6.QtCore.QSettings.Scope, parent: Union[PySide6.QtCore.QObject, NoneType] = None) -> None

官方说明

基本用法

创建QSettings对象时,您必须传递公司或组织的名称以及应用程序的名称。例如,如果您的产品名为Star Runner,而您的公司名为MySoft,您将按如下方式构造QSettings对象:

settings = QSettings("MySoft", "Star Runner")

QSettings对象可以在堆栈或堆上创建(即使用new)。构建和销毁QSettings对象非常快。

如果您在应用程序的许多地方使用QSettings,您可能希望使用setOrganizationName()和setApplicationName()指定组织名称和应用程序名称,然后使用默认的QSettings构造函数:

QCoreApplication.setOrganizationName("MySoft")
QCoreApplication.setOrganizationDomain("mysoft.com")
QCoreApplication.setApplicationName("Star Runner")
...
settings = QSettings()

(在这里,我们还指定了组织的Internet域。设置Internet域时,将在macOS和iOS上使用它而不是组织名称,因为macOS和iOS应用程序通常使用Internet域来标识自己。如果未设置域,则会从组织名称派生一个假域。有关详细信息,请参阅下面的Platform-Specific Notes。)

QSettings存储设置。每个设置包含一个QString,用于指定设置的名称(QVariant)和一个键,用于存储与该键关联的数据。要编写设置,请使用setValue()。例如:

settings.setValue("editor/wrapMargin", 68)

如果已经存在具有相同键的设置,则现有值将被新值覆盖。为了提高效率,更改可能不会立即保存到永久存储中。(您可以随时调用sync()来提交更改。)

您可以使用value()设置的值:

margin = settings.value("editor/wrapMargin").toInt()

如果没有具有指定名称的设置,QSettings将返回一个nullQVariant(可以转换为整数0)。您可以通过将第二个参数传递给value()来指定另一个默认值:

margin = settings.value("editor/wrapMargin", 80).toInt()

要测试给定键是否存在,请调用contains()。要删除与键关联的设置,请调用remove()。要获取所有键的列表,请调用allKeys()。要删除所有键,请调用clear()。

QVariant和GUI类型

因为QVariant是Qt Core模块的一部分,它不能提供转换函数到数据类型,如QColor、QImage和QPixmap,它们是Qt GUI的一部分。换句话说,没有QVariant,或toPixmap()toColor()toImage()函数。

相反,您可以使用value()模板函数。例如:

settings = QSettings("MySoft", "Star Runner")
color = settings.value("DataPump/bgcolor").value<QColor>()

反向转换(例如,从QColor到QVariant)对于QVariant支持的所有数据类型都是自动的,包括与GUI相关的类型:

settings = QSettings("MySoft", "Star Runner")
color = palette().background().color()
settings.setValue("DataPump/bgcolor", color)

使用qRegisterMetaType()注册的具有流式传输到和从QDataStream的运算符的自定义类型可以使用QSettings存储。

节和键语法

设置键可以包含任何Unicode字符。Windows注册表和INI文件使用不区分大小写的键,而macOS和iOS上的CFPremet API使用区分大小写的键。为避免可移植性问题,请遵循以下简单规则:

  • 始终使用相同的大小写引用相同的键。例如,如果您在代码中的一个地方将键称为“文本字体”,请不要在其他地方将其称为“文本字体”。
  • 避免除大小写外相同的键名。例如,如果您有一个名为“MainWindow”的键,请不要尝试将另一个键另存为“main windows”。
  • 不要在部分或键名中使用斜杠(‘/‘和’’);反斜杠字符用于分隔子键(见下文)。在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。

  • Star Runner应用程序的用户特定位置
  • MySoft所有应用程序的用户特定位置
  • Star Runner应用程序的系统范围位置
  • MySoft所有应用程序的系统范围位置

(请参阅下面Platform-Specific Notes,了解Qt支持的不同平台上的这些位置。)

如果在第一个位置找不到密钥,则在第二个位置继续搜索,依此类推。这使您能够存储系统范围或组织范围的设置,并在每个用户或每个应用程序的基础上覆盖它们。要关闭此机制,请调用setFallbacksEnabled(false)。

尽管所有四个位置的键都可以读取,但只有第一个文件(手头应用程序的用户特定位置)可以进行写入。要写入任何其他文件,请省略应用程序名称和/或指定SystemScope(与默认的UserScope相反)。

让我们看一个例子:

obj1 = QSettings("MySoft", "Star Runner")
obj2 = QSettings("MySoft")
obj3 = QSettings(QSettings.SystemScope, "MySoft", "Star Runner")
obj4 = QSettings(QSettings.SystemScope, "MySoft")

下表总结了哪些QSettings对象访问哪个位置。“X”表示该位置是与QSettings对象关联的主要位置,用于读取和写入;“o”表示该位置在读取时用作后备。

Locationsobj1obj2obj3obj4
User, ApplicationX
User, OrganizationoX
System, ApplicationoX
System, OrganizationoooX

这种机制的美妙之处在于它适用于Qt支持的所有平台,并且它仍然为您提供了很大的灵活性,而无需您指定任何文件名或注册表路径。

如果要在所有平台上使用INI文件而不是本机API,可以将IniFormat作为第一个参数传递给QSettings构造函数,后跟范围、组织名称和应用程序名称:

QSettings settings(QSettings.IniFormat, QSettings.UserScope, "MySoft", "Star Runner")

请注意,INI文件丢失了数字数据和用于编码它们的字符串之间的区别,因此写入数字的值应作为QString读回。可以使用toInt()、toDouble()和相关函数恢复数值。

通过设置编辑器示例,您可以试验不同的设置位置以及打开或关闭回退。

恢复GUI应用程序的状态

QSettings通常用于存储GUI应用程序的状态。以下示例说明如何使用QSettings保存和恢复应用程序主窗口的几何形状。

def writeSettings(self):
    settings = QSettings("Moose Soft", "Clipper")
    settings.beginGroup("MainWindow")
    settings.setValue("geometry", saveGeometry())
    settings.endGroup()
    
def readSettings(self):
    settings = QSettings("Moose Soft", "Clipper")
    settings.beginGroup("MainWindow")
    geometry = settings.value("geometry", QByteArray()).toByteArray()
    if geometry.isEmpty():
        setGeometry(200, 200, 400, 400)
    else:
        restoreGeometry(geometry)
        settings.endGroup()

请参阅窗口几何以讨论为什么调用resize()和move()而不是setGeometry()来恢复窗口的几何图形更好。

必须从主窗口的构造函数调用readSettings()和writeSettings()函数并关闭事件处理程序,如下所示:

def __init__(self):            ...
readSettings()
def closeEvent(event):

    if userReallyWantsToQuit():
        writeSettings()
        event.accept()
    else:
        event.ignore()

有关使用QSettings的自包含示例,请参阅应用程序示例。

同时从多个线程或进程访问设置

QSettings是可重入的。这意味着您可以在不同的线程中同时使用不同的QSettings对象。即使QSettings对象引用磁盘上的相同文件(或系统注册表中的相同条目),这一保证仍然有效。如果通过一个QSettings对象修改了设置,更改将立即在同一位置和同一进程中运行的任何其他QSettings对象中可见。

QSettings可以安全地从不同的进程(可以是同时运行的应用程序的不同实例,也可以是完全不同的应用程序)读取和写入相同的系统位置,前提是满足某些条件。对于IniFormat,它使用咨询文件锁定和智能合并算法来确保数据完整性。其工作条件是可写配置文件必须是常规文件,并且必须位于当前用户可以在其中创建新的临时文件的目录中。如果不是这种情况,则必须使用setAtomicSyncRequired()来关闭安全性。

请注意,sync()导入其他进程所做的更改(除了从这个QSettings写入更改)。

存储应用程序设置的位置

如Fallback Mechanism部分所述,QSettings将应用程序的设置存储在最多四个位置,具体取决于设置是用户特定的还是系统范围的,以及设置是application-specific的还是组织范围的。

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

  • $HOME/.config/MySoft/Star Runner.conf(Qt为嵌入式Linux:$HOME/Settings/MySoft/Star Runner.conf
  • $HOME/.config/MySoft.conf(Qt为嵌入式Linux:$HOME/Settings/MySoft.conf
  • 对于$XDG_CONFIG_DIRS中的每个目录 <dir>/MySoft/Star Runner.conf
  • 对于$XDG_CONFIG_DIRS中的每个目录 <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(Qt为嵌入式Linux:$HOME/Settings/MySoft/Star Runner.ini
  2. $HOME/.config/MySoft.ini(Qt为嵌入式Linux:$HOME/Settings/MySoft.ini
  3. 对于$XDG_CONFIG_DIRS中的每个目录 <dir>/MySoft/Star Runner.ini
  4. 对于$XDG_CONFIG_DIRS中的每个目录 <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_为前缀的标识符是要传递给Win32 API函数SHGetKnownFolderPath()以获取相应路径的特殊项目ID列表。

FOLDERID_RoamingAppData通常指向C:\Users\User Name\AppData\Roaming,也由环境变量%APPDATA%显示。

FOLDERID_ProgramData通常指向C:\ProgramData。

如果文件格式是IniFormat,这是应用程序主目录中的“设置/MySoft/Star Runner. ini”。

setPath()和.ini.conf文件可以使用。在Unix、macOS和iOS用户可以通过设置XDG_CONFIG_HOME环境变量来覆盖它们;有关详细信息,请参阅setPath()。

直接访问INI和. plist文件

有时您确实希望将入口设置存储在特定文件或注册表路径中。在所有平台上,如果您想直接读取INI文件,您可以使用QSettings构造函数,它将文件名作为第一个参数,并将IniFormat作为第二个参数传递。例如:

QSettings settings("/home/petra/misc/myapp.ini", QSettings.IniFormat)

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

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

QSettings settings("/Users/petra/misc/myapp.plist", QSettings.NativeFormat)
直接访问Windows注册表

在Windows上,QSettings允许您在系统注册表中使用QSettings(或支持格式的设置,例如字符串数据)编写入口设置。这是通过在注册表和QSettings中构造一个带有路径的NativeFormat对象来完成的。

例如:

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上,键可以同时具有值和子键。使用“默认”或“.”代替子键访问其默认值:

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以外的其他平台上,“默认”和“.”将被视为常规子键。

平台限制

虽然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使用的CFPretions API需要Internet域名,而不是组织名称。为了提供统一的API,QSettings从组织名称派生一个假域名(除非组织名称已经是域名,例如OpenOffice.org)。该算法将“. com”附加到公司名称,并用连字符替换空格和其他非法字符。如果要指定不同的域名,请调用main(),和setOrganizationDomain()setOrganizationName()函数,然后在QSettings构造函数中使用默认的setApplicationName()。另一种解决方案是使用预处理器指令,例如:
#ifdef Q_OS_MAC
    settings = QSettings("grenoullelogique.fr", "Squash")
#else
    settings = QSettings("Grenoulle Logique", "Squash")
#endif
  • 在macOS上,不属于当前用户(即SystemScope)的入口设置权限已在10.7(Lion)中更改。在该版本之前,具有管理员权限的用户可以访问这些权限。对于10.7和10.8(Mountain Lion),只有root可以。但是,10.9(Mavericks)再次更改了该规则,但仅限于本机格式(plist文件)。

QVariant QSessionManager 设置编辑器示例 Qt小部件-应用示例

方法

方法描述
allKeys(self) -> List[str]返回可以使用QSettings对象读取的所有键(包括子键)的列表。
如果使用BeginGroup()设置组,则仅返回组中的键,不返回组前缀
详细说明
applicationName(self) -> str返回用于存储设置的应用程序名称。
beginGroup(prefix: str) -> None将前缀附加到当前组。
当前组会自动添加到QSettings指定的所有键中。此外,诸如child Group()、child Keys()和allKeys()等查询函数都是基于该组的。默认情况下,不设置组。
组有助于避免一遍又一遍地输入相同的设置路径。
详细说明
beginReadArray(prefix: str) -> int将前缀添加到当前组并开始从数组读取。返回数组的大小。
详细说明
beginWriteArray(prefix: str, size: int = -1) -> None将前缀添加到当前组并开始写入大小大小的数组。如果size为-1(默认值),则根据写入的条目的索引自动确定。

如果您多次出现某组密钥,您可以使用数组来简化您的生活。例如,假设您要保存一个可变长度的用户名和密码列表。然后您可以编写
详细说明
childGroups(self) -> List[str]返回包含可以使用QSettings对象读取的键的所有键顶级组的列表。
详细说明
childKeys(self) -> List[str]返回可以使用QSettings对象读取的所有顶级键的列表。
详细说明
clear(self) -> None删除与此QSettings对象关联的主要位置中的所有条目。
后备位置中的条目不会被删除。
如果只想删除当前组()中的条目,请改用删除(“”)。
contains(key: str) -> bool如果存在名为key的设置,则返回true;否则返回false。
如果使用starinGroup()设置组,则将key视为相对于该组。
请注意,Windows注册表和INI文件使用不区分大小写的键,而macOS和iOS上的CFPretions API使用区分大小写的键。为避免可移植性问题,请参阅部分和键语法规则。
endArray(self) -> None关闭使用BEINReadArray()或BEINWriteArray()启动的数组。
endGroup(self) -> None将组重置为相应的starinGroup()调用之前的状态。
详细说明
fallbacksEnabled(self) -> bool如果启用了回退,则返回true;否则返回false。
默认情况下,启用回退。
fileName(self) -> str返回存储使用此QSettings对象写入的设置的路径。
在Windows上,如果格式是NativeFormat,则返回值是系统注册表路径,而不是文件路径。
format(self) -> PySide6.QtCore.QSettings.Format返回用于存储设置的格式。
group(self) -> str返回当前组。
isAtomicSyncRequired(self) -> bool如果QSettings只允许执行设置的原子保存和重新加载(同步),则返回true。如果允许将设置内容直接保存到配置文件中,则返回false。
默认值为真。
isWritable(self) -> bool如果可以使用此QSettings对象编写设置,则返回true;否则返回false。
isWritable()可能返回false的一个原因是QSettings是否对只读文件进行操作。
organizationName(self) -> str返回用于存储设置的组织名称。
remove(key: str) -> None删除设置键和键的任何子设置。
详细说明
scope(self) -> PySide6.QtCore.QSettings.Scope返回用于存储设置的范围。
setArrayIndex(i: int) -> None将当前数组索引设置为i。对setValue()、value()、删除()和包含()等函数的调用将对该索引处的数组条目进行操作。
您必须先调用BeginReadArray()或BeginWriteArray(),然后才能调用此函数。
setAtomicSyncRequired(enable: bool) -> None配置是否需要QSettings来执行设置的原子保存和重新加载(同步)。如果启用参数为true(默认值),sync()将仅执行原子同步操作。如果这不可能,sync()将失败,status()将成为错误条件。
将此属性设置为false将允许QSettings直接写入配置文件,并忽略任何试图将其锁定在同时尝试写入的其他进程上的错误。由于可能损坏,应谨慎使用此选项,但在某些情况下是必需的,例如存在于不可写目录或NTFS备用数据流中的IniFormat配置文件。
有关该功能的更多信息,请参阅QSaveFile。
setFallbacksEnabled(b: bool) -> None将是否启用回退设置为b。
默认情况下,启用回退。
setValue(key: str, value: Any) -> None将设置键的值设置为value。如果键已经存在,则覆盖之前的值。
请注意,Windows注册表和INI文件使用不区分大小写的键,而macOS和iOS上的CFPretions API使用区分大小写的键。为避免可移植性问题,请参阅部分和键语法规则。详细说明
status(self) -> PySide6.QtCore.QSettings.Status返回一个状态代码,指示QSettings遇到的第一个错误,如果没有发生错误,则返回NoError。
请注意QSettings会延迟执行某些操作。因此,您可能希望调用sync()以确保在调用status()之前将存储在QSettings中的数据写入磁盘。
sync(self) -> None将任何未保存的更改写入永久存储,并重新加载同时由另一个应用程序更改的任何设置。
此函数从QSettings的析构函数和事件循环定期自动调用,因此您通常不需要自己调用它。
value(key: str) -> Any
value(arg__1: str, defaultValue: Union[Any, NoneType] = None, type: Union[object, NoneType] = None) -> object
自定义重载,将可选的命名参数添加到函数value()以自动转换函数返回的类型。
这种情况的一个示例可能是包含单元素列表值的ini文件:
详细说明
[Static]defaultFormat() -> PySide6.QtCore.QSettings.Format返回用于存储QSettings(QObject*)构造函数设置的默认文件格式。如果未设置默认格式,则使用NativeFormat。
[Static]setDefaultFormat(format: PySide6.QtCore.QSettings.Format) -> None将默认文件格式设置为给定格式,用于存储QSettings(QObject*)构造函数的设置。
如果未设置默认格式,则使用NativeFormat。请参阅您正在使用的QSettings构造函数的留档,以查看该构造函数是否会忽略此函数。
[Static]setPath(format: PySide6.QtCore.QSettings.Format, scope: PySide6.QtCore.QSettings.Scope, path: str) -> None将用于存储给定格式和范围的设置的路径设置为路径。格式可以是自定义格式。
详细说明
  • PySide6.QtCore.QSettings.Scope

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

    ConstantDescription
    QSettings.UserScope将设置存储在特定于当前用户的位置(例如,在用户的主目录中)。
    QSettings.SystemScope将设置存储在全局位置,以便同一台机器上的所有用户访问相同的设置集。
allKeys

返回可以使用QSettings对象读取的所有键(包括子键)的列表。

settings = QSettings()
settings.setValue("fridge/color", QColor(Qt.white))
settings.setValue("fridge/size", QSize(32, 96))
settings.setValue("sofa", True)
settings.setValue("tv", False)
keys = settings.allKeys()
# keys: ["fridge/color", "fridge/size", "sofa", "tv"]

如果使用BeginGroup()设置组,则仅返回组中的键,不返回组前缀:

settings.beginGroup("fridge")
keys = settings.allKeys()
# keys: ["color", "size"]
beginGroup

将前缀附加到当前组。

当前组会自动添加到QSettings指定的所有键中。此外,诸如child Group()、child Keys()和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()将当前组重置为相应的starinGroup()调用之前的状态。组可以嵌套。

在6.4之前的Qt版本中,此函数采用QString,而不是QAnyStringView。

beginReadArray

将前缀添加到当前组并开始从数组读取。返回数组的大小。

class Login():
    userName = QString()
    password = QString()

logins = QList()
...
settings = QSettings()
size = settings.beginReadArray("logins")
for i in range(0, size):
    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版本中,此函数采用QString,而不是QAnyStringView。

beginWriteArray

将前缀添加到当前组并开始写入大小大小的数组。如果size为-1(默认值),则根据写入的条目的索引自动确定。

如果您多次出现某组密钥,您可以使用数组来简化您的生活。例如,假设您要保存一个可变长度的用户名和密码列表。然后您可以编写:

class Login():
    userName = QString()
    password = QString()

logins = QList()
...
settings = QSettings()
settings.beginWriteArray("logins")
for i in range(0, logins.size()):
    settings.setArrayIndex(i)
    settings.setValue("userName", list.at(i).userName)
    settings.setValue("password", list.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

要读回数组,请使用startinReadArray()

在6.4之前的Qt版本中,此函数采用QString,而不是QAnyStringView。

childGroups

返回包含可以使用QSettings对象读取的键的所有键顶级组的列表。

settings = QSettings()
settings.setValue("fridge/color", QColor(Qt.white))
settings.setValue("fridge/size", QSize(32, 96))
settings.setValue("sofa", True)
settings.setValue("tv", False)
groups = settings.childGroups()
# groups: ["fridge"]

如果使用BeginGroup()设置组,则返回该组中的第一级键,不带组前缀。

settings.beginGroup("fridge")
groups = settings.childGroups()
# groups: []

您可以递归地使用ChilKeys()和child Group()浏览整个设置层次结构。

childKeys

返回可以使用QSettings对象读取的所有顶级键的列表。

settings = QSettings()
settings.setValue("fridge/color", QColor(Qt.white))
settings.setValue("fridge/size", QSize(32, 96))
settings.setValue("sofa", True)
settings.setValue("tv", False)
keys = settings.childKeys()
# keys: ["sofa", "tv"]

如果使用BeginGroup()设置组,则返回该组中的顶级键,不带组前缀:

settings.beginGroup("fridge")
keys = settings.childKeys()
# keys: ["color", "size"]

您可以递归地使用ChilKeys()和childGroup()浏览整个设置层次结构。

endGroup

将组重置为相应的starinGroup()调用之前的状态。

settings.beginGroup("alpha")
# settings.group() == "alpha"
settings.beginGroup("beta")
# settings.group() == "alpha/beta"
settings.endGroup()
# settings.group() == "alpha"
settings.endGroup()
# settings.group() == ""
remove

删除设置键和键的任何子设置。

settings = QSettings()
settings.setValue("ape")
settings.setValue("monkey", 1)
settings.setValue("monkey/sea", 2)
settings.setValue("monkey/doe", 4)
settings.remove("monkey")
keys = settings.allKeys()
# keys: ["ape"] 	

请注意,如果其中一个后备位置包含具有相同键的设置,则该设置将在调用删除()后可见。

如果key为空字符串,则删除当前组()中的所有键。例如:

settings = QSettings()
settings.setValue("ape")
settings.setValue("monkey", 1)
settings.setValue("monkey/sea", 2)
settings.setValue("monkey/doe", 4)
settings.beginGroup("monkey")
settings.remove("")
settings.endGroup()
keys = settings.allKeys()
# keys: ["ape"]

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

setPath

将用于存储给定格式和范围的设置的路径设置为路径。格式可以是自定义格式。

下表总结了默认值:

PlatformFormatScopePath
WindowsIniFormatUserScopeFOLDERID_RoamingAppData
SystemScopeFOLDERID_ProgramData
UnixNativeFormat , IniFormatUserScope$HOME/.config
SystemScope/etc/xdg
Qt for Embedded LinuxNativeFormat , IniFormatUserScope$HOME/Settings
SystemScope/etc/xdg
macOS and iOSIniFormatUserScope$HOME/.config
SystemScope/etc/xdg

用户可以通过设置XDG_CONFIG_HOME环境变量来覆盖Unix、macOS和iOS上的默认UserScope路径( H O M E / . c o n f i g 或 HOME/. config或 HOME/.configHOME/Settings)。使用配置脚本的-syscondir标志构建Qt库时,可以覆盖Unix、macOS和iOS(/etc/xdg)上的默认SystemScope路径(有关详细信息,请参阅QLibraryInfo)。

在Windows、macOS和iOS上设置NativeFormat路径无效。

此函数不会影响现有的QSettings对象。

setValue

将设置键的值设置为value。如果键已经存在,则覆盖之前的值。

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

settings = QSettings()
settings.setValue("interval", 30)
settings.value("interval").toInt() # returns 30
settings.setValue("interval", 6.55)
settings.value("interval").toDouble() # returns 6.55
value

自定义重载,将可选的命名参数添加到函数value()以自动转换函数返回的类型。

这种情况的一个示例可能是包含单元素列表值的ini文件:

settings.setValue('var', ['a'])

ini文件将是:

[General]
var=a  # we cannot know that this is a list!

阅读后,我们可以指定是否需要默认行为、str或将输出强制转换为列表。

settings.value(‘var’) 

将得到“a”设置. value(‘var’,type=list)#将得到[“a”]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值