QSettings简介(通俗化)

QSettings 类提供持久的独立于平台的应用程序设置,是 Qt 框架中用于跨平台应用程序设置的存储的类它提供了一个方便的 API 来保存和读取应用程序的配置信息,如窗口大小、用户偏好等。【通俗的讲即保存应用程序的配置,用于下次程序再次启动时按照保存的数值进行初始化;他提供的方法让我们很方便的就可以实现参数的保存和数据读取】。

QSettings 能够存储键值对,并且可以处理多种数据类型。

主要特点:

  1. 跨平台:QSettings 能够在不同的操作系统上工作,包括 Windows、macOS、Linux 和移动平台。
  2. 易于使用:提供了简单的 API 来存取设置。
  3. 格式支持:支持 INI 文件格式和本地系统特定的格式,如 Windows 注册表或 macOS 的 plist 文件。

     在Windows操作系统下它通常有两种表现形式:

  1. INI文件:
  2. 注册表:
    打开方式: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

  1. 如果格式为QSettings::NativeFormat,则fileName的含义取决于平台。在Unix上,fileName是INI文件的名称。在macOS和iOS上,fileName是.plist文件的名称。在Windows上,fileName是系统注册表中的路径。
  2. 如果格式为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();


 

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值