QSettings 类提供持久的独立于平台的应用程序设置,是 Qt 框架中用于跨平台应用程序设置的存储的类。它提供了一个方便的 API 来保存和读取应用程序的配置信息,如窗口大小、用户偏好等。【通俗的讲即保存应用程序的配置,用于下次程序再次启动时按照保存的数值进行初始化;他提供的方法让我们很方便的就可以实现参数的保存和数据读取】。
QSettings 能够存储键值对,并且可以处理多种数据类型。
主要特点:
- 跨平台:QSettings 能够在不同的操作系统上工作,包括 Windows、macOS、Linux 和移动平台。
- 易于使用:提供了简单的 API 来存取设置。
- 格式支持:支持 INI 文件格式和本地系统特定的格式,如 Windows 注册表或 macOS 的 plist 文件。
在Windows操作系统下它通常有两种表现形式:
- INI文件:
- 注册表:
打开方式:win+R 打开 regedit
默认注册表位置:HKEY_CURRENT_USER
基本用法:
1、构造函数(部分):
QSettings::QSettings(QSettings::Scope scope, QObject *parent = nullptr)
以与QSettings(QObject*父级)相同的方式构造QSettings对象,但具有给定的作用域。
作用域指定:设置是用户特定的还是由同一系统的所有用户共享的。
QSettings::QSettings(const QString&fileName,QSettings::Format Format,QObject*parent=nullptr)
构造一个QSettings对象,用于使用父级访问名为fileName的文件中存储的设置。(Constructs a QSettings object for accessing the settings stored in the file called fileName, with parent parent.)如果文件不存在,则创建它。
QSettings::Format Format
- 如果格式为QSettings::NativeFormat,则fileName的含义取决于平台。在Unix上,fileName是INI文件的名称。在macOS和iOS上,fileName是.plist文件的名称。在Windows上,fileName是系统注册表中的路径。
- 如果格式为QSettings::IniFormat,则fileName是INI文件的名称。
QSettings::QSettings(const QString &organization, const QString &application = QString(), QObject *parent = nullptr)
构造一个QSettings对象,用于从名为organization的组织和父级访问名为application的应用程序的设置。
2、写入设置:
settings.setValue("key", value);
setValue 方法接受一个键(`key`)和一个值(`value`),并将它们存储起来。`value` 可以是多种类型,如 `int`、`double`、`QString` 等。
***注意***:如果键已存在(`key`),则覆盖之前的值(`value`)。
//Example:
QSettings settings;
settings.setValue("interval", 30);
settings.value("interval").toInt(); // returns 30
settings.setValue("interval", 6.55);
settings.value("interval").toDouble(); // returns 6.55
3、读取设置:
value = settings.value("key", defaultValue);
`value` 是一个模板参数,`defaultValue` 是当指定键不存在时返回的默认值。如果没有指定默认值,则返回默认的QVariat。
Example:
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
4、QStringList QSettings::allKeys()const
返回可以使用QSettings对象读取的所有键(包括子键)的列表。
//Example:
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"]
5、void QSettings::beginGroup(const QString&prefix)
将prefix(前缀)附加到当前组。
有助于避免反复键入相同的设置路径。
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=win->size()
mainwindow/fullScreen=win->isFullScreen()
outputpanel/visible=panel->isVisible()
*/
调用endGroup()将当前组重置为相应beginGroup()调用之前的状态。
6、void QSettings::endGroup()
将组重置为相应beginGroup()调用之前的状态。
Example:
settings.beginGroup("alpha");
// settings.group() == "alpha"
settings.beginGroup("beta");
// settings.group() == "alpha/beta"
settings.endGroup();
// settings.group() == "alpha"
settings.endGroup();
// settings.group() == ""
7、void QSettings::setArrayIndex(int i)
将当前数组索引设置为i。
8、void QSettings::beginWriteArray(const QString &prefix, int size = -1)
向当前组添加前缀,并开始写大小为size的数组。如果大小为-1(默认值),则根据写入条目的索引自动确定。
如果某一组键出现多次,可以使用数组使您的生活更轻松。例如,假设您想保存一个可变长度的用户名和密码列表。然后你可以写:
struct Login {
QString userName;
QString password;
};
QList<Login> logins;
QSettings settings;
settings.beginWriteArray("logins");
for (int i = 0; i < logins.size(); ++i) {
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
*/
8、int QSettings::beginReadArray(const QString &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();
10、 示例:
// 写入设置
QSettings settings("YourCompany", "YourAppName");
settings.setValue("window/size", QSize(800, 600));
settings.setValue("window/position", QPoint(100, 100));
settings.setValue("isMaximized", false);
//上边语句也可以这样写,使用组
/*
settings.beginGroup("window");
settings.setValue("size", QSize(800, 600));
settings.setValue("position", QPoint(100, 100));
settings.setValue("isMaximized", false);
settings.endGroup();
*/
// 读取设置
QSize windowSize = settings.value("window/size").toSize();
QPoint windowPosition = settings.value("window/position").toPoint();
bool isMaximized = settings.value("isMaximized").toBool();
//未知键的情况下读取
QStringList list = settings.allkeys();//返回所有的键
for(QString str: list){
qDebug<<str<< settings.value(str).toString;
}
//若是在window下写入 x 个"size","position","isMaximized"
settings.beginWriteArray("window");
for(int i=0;i<x ;i++){
settings.setArrayIndex(i);
settings.setValue("size", QSize(800, 600));
settings.setValue("position", QPoint(100, 100));
settings.setValue("isMaximized", false);
}
settings.endArray();
//生成INI文件
QSettinigs settings("test.ini",QSettings::INiFormat);
//其写入、读取设置方式与上相同
组织结构:
QSettings 允许你将设置组织成层次结构,类似于文件系统。在上面的例子中,"window/size" 和 "window/position" 使用了 `/` 作为分隔符来表示它们属于 `window` 这个子分类。
格式和位置:
`QSettings` 可以通过构造函数的参数来指定存储格式:
- `QSettings::IniFormat`:INI 文件格式。
- `QSettings::NativeFormat`:操作系统的本地格式(例如 Windows 的注册表)。
`QSettings` 还支持读写数组和子路径,以及监听设置的变化。
//监听设置变化:
connect(&settings, &QSettings::valueChanged, this, &MyClass::onValueChanged);
这允许你在设置值改变时执行某些操作。
使用数组:
// 开始写入数组
settings.beginWriteArray("history");
// 写入元素
settings.setArrayIndex(0);
settings.setValue("path", "/path/to/file1");
// 结束写入数组
settings.endArray();