QSettings简介
QSettings类提供了持久的独立于平台的应用程序设置。
用户通常希望应用程序能够跨会话记住它的设置(窗口大小和位置,选项等)。在Windows上,这些信息通常存储在系统注册表中,在macOS和iOS上则存储在属性列表文件中。在Unix系统中,在没有标准的情况下,许多应用程序(包括KDE应用程序)使用INI文本文件。
QSettings是围绕这些技术的抽象,使您能够以可移植的方式保存和恢复应用程序设置。它还支持自定义存储格式。
QSettings的API基于QVariant,允许您以最小的努力保存大多数基于值的类型,如QString, QRect和QImage。
如果您所需要的只是一个基于非持久内存的结构,则考虑使用QMap<QString, QVariant>。
常用Api
构造一个QSettings对象,用于访问存储在名为fileName的文件中的设置,带有父元素。如果文件还不存在,则创建它。如果format为QSettings::NativeFormat, fileName的含义取决于平台。在Unix上,fileName是一个INI文件的名称。在macOS和iOS上,fileName是一个.plist文件的名称。在Windows上,fileName是系统注册表中的一个路径。
如果format为QSettings::IniFormat,则fileName为INI文件的名称。
QSettings::QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr)
向当前组追加前缀。也可理解为开始一个节或者键值对组。
void QSettings::beginGroup(const QString &prefix)
与QSettings::beginGroup配合使用。
void QSettings::endGroup()
将设置键的值设置为value。如果该键已经存在,则覆盖之前的值。
void QSettings::setValue(const QString &key, const QVariant &value)
返回设置键的值。如果该设置不存在,则返回defaultValue。
如果没有指定默认值,则返回默认QVariant。
QVariant QSettings::value(const QString &key, const QVariant &defaultValue = QVariant()) const
如果存在一个名为key的设置,则返回true;否则返回false。
bool QSettings::包含(const QString &key) const
ini文件
.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void readIni();
void writeIni();
protected:
void closeEvent(QCloseEvent *event) override;
private slots:
void on_btnSetColor_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
.cpp问价
#include "widget.h"
#include "ui_widget.h"
#include<QSettings>
#include<QCloseEvent>
#include<QColorDialog>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
readIni();
}
Widget::~Widget()
{
delete ui;
}
void Widget::readIni()
{
QSettings settings("GuiState.ini",QSettings::IniFormat);
settings.beginGroup("MainWindow");
resize(settings.value("size", QSize(400, 400)).toSize());
move(settings.value("pos", QPoint(200, 200)).toPoint());
//设置背景
QPalette pal(this->palette());
pal.setColor(QPalette::Background, settings.value("color", QColor(255,255,255)).value<QColor>());
this->setAutoFillBackground(true);
this->setPalette(pal);
settings.endGroup();
}
void Widget::writeIni()
{
QSettings settings("GuiState.ini",QSettings::IniFormat);
settings.beginGroup("MainWindow");
settings.setValue("size", size());
settings.setValue("pos", pos());
settings.endGroup();
}
void Widget::closeEvent(QCloseEvent *event)
{
writeIni();
}
void Widget::on_btnSetColor_clicked()
{
QColorDialog colorDialog;
connect(&colorDialog, &QColorDialog::colorSelected, this, [&](QColor curColor){
QSettings settings("GuiState.ini",QSettings::IniFormat);
settings.beginGroup("MainWindow");
settings.setValue("color", curColor);
settings.endGroup();
//设置背景
QPalette pal(this->palette());
pal.setColor(QPalette::Background, curColor);
this->setAutoFillBackground(true);
this->setPalette(pal);
});
colorDialog.exec();
}