Setting

一、描述

Settings类型提供持久的与平台无关的应用程序设置。
注意:此类型是通过导入Qt.labs.settings模块提供的。实验室模块中的类型不保证在未来的版本中保持兼容。

用户通常希望应用程序能够跨会话记住它的设置(窗口大小和位置,选项等)。设置类型使您能够以最少的工作量保存和恢复此类应用程序设置。
通过在Settings元素中声明属性来指定各个设置值。支持所有基本类型属性。推荐的方法是使用属性别名,以便以两种方式自动更新属性。下面的示例显示如何使用“设置”存储和恢复窗口的几何图形。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import QtQuick.Window 2.1
import Qt.labs.settings 1.0

Window {
id: window

width: 800
height: 600

Settings {
property alias x: window.x
property alias y: window.y
property alias width: window.width
property alias height: window.height
}
}

在应用程序第一次启动时,窗口获得指定为800x600的默认尺寸。注意,没有指定默认位置—我们让窗口管理器处理它。稍后,当窗口几何形状更改时,新值将自动存储到持久设置中。第二次运行的应用程序将从持久设置中获得初始值,使窗口恢复到以前的位置和大小。
通过使用属性别名来实现完全声明式语法,代价是在别名属性的值发生更改时存储持久设置。普通属性可用于对存储持久设置进行更细粒度的控制。下面的例子演示了如何保存组件销毁的设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import QtQuick 2.1
import Qt.labs.settings 1.0

Item {
id: page

state: settings.state

states: [
State {
name: "active"
// ...
},
State {
name: "inactive"
// ...
}
]

Settings {
id: settings
property string state: "active"
}

Component.onDestruction: {
settings.state = page.state
}
}

注意现在如何在持久设置属性中指定默认值,并将实际属性绑定到该设置,以便从持久设置获得初始值。

二、应用识别符

通过提供应用程序名称、组织和域或指定fileName来标识特定于应用程序的设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
app.setOrganizationName("Some Company");
app.setOrganizationDomain("somecompany.com");
app.setApplicationName("Amazing Application");

QQmlApplicationEngine engine("main.qml");
return app.exec();
}

这些通常在c++中main()的开头指定,但也可以通过以下属性在QML中控制:

  • Qt.application.name,
  • Qt.application.organization
  • Qt.application.domain。

三、类

通过类别属性指定类别名称,可以将应用程序设置划分为逻辑类别。使用逻辑分类不仅可以提供更清晰的设置结构,还可以防止设置键之间可能的冲突。
如果需要多个类别,使用多个设置对象,每个对象都有自己的类别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Item {
id: panel

visible: true

Settings {
category: "OutputPanel"
property alias visible: panel.visible
// ...
}

Settings {
category: "General"
property alias fontSize: fontSizeSpinBox.value
// ...
}
}

不用确保应用程序中的所有设置都有唯一的名称,设置可以划分为唯一的类别,然后这些类别可能包含使用其他类别中使用的相同名称的设置——而不会产生冲突。

四、注意事项

当前的实现基于QSettings。这就增加了某些限制,例如缺少变更通知。使用一个设置实例写入设置值不会更新另一个设置实例中的值,即使它们引用同一类别中的相同设置。
信息存储在Windows上的系统注册表中,存储在macOS上的XML首选项文件中。在其他Unix系统中,如果没有标准,则使用INI文本文件。更多细节请参阅QSettings文档。

五、属性

  1. category : string

    此属性保存设置类别的名称。
    类别可用于将相关设置分组在一起。

  2. fileName : string

    此属性保存设置文件的路径。如果该文件不存在,则创建该文件。
    这个属性是在Qt 5.12中引入的。

六、方法

  1. setValue(string key, var value)

    将设置键的值设置为value。如果该键已经存在,则覆盖之前的值。
    该方法在Qt 5.12中被引入。

  2. sync()

    将任何未保存的更改写入永久存储,并重新加载同时被另一个应用程序更改的任何设置。
    这个函数会从QSettings的析构函数中自动调用,并由事件循环定期调用,所以您通常不需要自己调用它。

  3. var value(string key, var defaultValue)

    返回设置键的值。如果该设置不存在,则返回defaultValue。
    该方法在Qt 5.12中被引入。