Qt - 文件操作3
8. QSettings
8.1 简介
用户通常希望应用程序在会话中记住它的设置(窗口大小和位置,选项等)。 这些信息通常存储在Windows上的系统注册表中(HKEY_CURRENT_USERSoftware/MySoft ),以及macOS和iOS上的属性列表文件中。 在Unix系统上,在缺乏标准的情况下,许多应用程序(包括KDE应用程序)使用INI文本文件。
QSettings是对这些技术的抽象,使您能够以可移植的方式保存和恢复应用程序设置。 它还支持自定义存储格式。
QSettings的API基于QVariant,因此我们可以保存很多的类型,如QString、QRect和QImage。
如果您所需要的只是一个非持久的基于内存的结构,那么可以考虑使用QMap<QString,QVariant>替代。
8.2 基本用法
创建QSettings对象时,必须传递公司或组织的名称以及应用程序的名称。 例如,如果你的程序名为QQ,而你的公司名为NiuBi,你将构造QSettings对象如下:
QSettings setting("NiuBi","QQ");
QSettings对象既可以在堆栈上创建,也可以在堆上创建(即使用new)。 构造和销毁QSettings对象非常快。
如果你在应用程序的很多地方使用QSettings,你可能想要使用QCoreApplication::setOrganizationName()和QCoreApplication::setApplicationName()指定组织名称和应用程序名称,然后使用默认的QSettings构造函数:
QCoreApplication::setOrganizationName("NiuBi");
QCoreApplication::setOrganizationDomain("NiuBi.com");
QCoreApplication::setApplicationName("QQ");
...
QSettings settings;
QSettings存储设置。 每个设置由一对(key,value)键值对(key为QStirng类型,value为QVariant
)组成。 要写入设置,可以使用setValue()。 例如:
setting.setValue("size",QSize(640,480));
qDebug()<< setting.fileName(); //获取配置文件保存位置
如果已经存在具有相同键的设置,则现有值将被新值覆盖。 为了提高效率,更改可能不会立即保存到永久存储中。 (可以调用sync()来立即提交更改。)
你可以使用value()获取设置的值:
QSize size = setting.value("size",QSize(250,250)).value<QSize>();
如果没有指定名称的设置,QSettings返回一个空的QVariant(无效的)。你可以通过传递第二个参数给value()来指定另一个默认值(这里传了QSize(250,250),如果配置文件中没有size,就返回自己传的这个数据)。
配置文件格式
在windows下,默认为写入注册表,如果想要写入到.ini文件并保存到exe所在目录,该怎么设置呢?
QApplication::setOrganizationName("NiuBi");
QApplication::setApplicationName("QQ");
QSettings setting(QApplication::applicationDirPath()+"/qfile.ini" ,QSettings::Format::IniFormat);
8.3 公有函数
常用函数
-
设置将key设置为value的值。 如果键已经存在,则覆盖前面的值。
void setValue(const QString &key, const QVariant &value)
-
返回设置键的值。 如果该设置不存在,则返回defaultValue。
如果没有指定默认值,则返回一个默认的QVariant。
QVariant QSettings::value(const QString &key, const QVariant &defaultValue = QVariant()) const
-
将任何未保存的更改写入永久存储,并重新加载与此同时被另一个应用程序更改的任何设置。
这个函数会定期从QSettings的析构函数和事件循环中自动调用,所以您通常不需要自己调用它。
void QSettings::sync()
-
返回一个状态码,指示QSettings遇到的第一个错误,如果没有错误发生,则返回QSettings::NoError。
QSettings::Status status() const
-
删除设置键和键的任何子设置。
void remove(const QString &key)
-
返回使用该QSettings对象写入的设置存储的路径。
在Windows上,如果格式为QSettings::NativeFormat,则返回值为系统注册表路径,而不是文件路径。
QString QSettings::fileName() const
分组函数
-
向当前组添加前缀。
void beginGroup(const QString &prefix)
void endGroup()
-
返回当前组。
QString QSettings::group() const
-
向当前组添加前缀并开始从数组读取。 返回数组的大小。[有案例]
int beginReadArray(const QString &prefix)
-
向当前组添加前缀,并开始写入大小为size的数组。 如果size为-1(默认值),则根据写入的条目的索引自动确定size。 [有案例]
void beginWriteArray(const QString &prefix, int size = -1)
-
关闭数组
void endArray()
-
将当前数组的索引设置为i。调用setValue()、value()、remove()和contains()等函数将对该索引处的数组项进行操作。
void setArrayIndex(int i)
8.4 操作ini文件
#include "widget.h"
#include <QApplication>
#include <QSettings>
#include <QDebug>
// 写ini配置文件
void setIni()
{
QSettings * myini = new QSettings("config.ini", QSettings::IniFormat);
myini->setValue("person/name", "张三");
myini->setValue("person/age", "12");
myini->setValue("cat/name", "小小");
delete myini;
}
// 读ini配置文件
void getIni()
{
QSettings * myini = new QSettings("config.ini", QSettings::IniFormat);
QString personName = myini->value("person/name").toString();
QString catName = myini->value("cat/name").toString();
delete myini;
qDebug() << "人的姓名: " << personName ;
qDebug() << "猫的姓名: " << catName ;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
// 写配置文件
setIni();
// 读配置文件
getIni();
return a.exec();
}
8.5 操作注册表
(1)写入注册表
#include <QSettings>
void Widget::writeKey()
{
//实例 QSettings
//参数 1:注册表位置
//参数 2:操作 windows 注册表 QSettings::NativeFormat
//说明:QSettings::IniFormat 读写 ini 格式的配置文件,前面用过。
QSettings *reg = new QSettings("HKEY_CURRENT_USER\\Software\\Qt01", QSettings::NativeFormat);
//设定值有修改,没有创建。
reg->setValue("键名 001","值 001");
reg->setValue("键名 002",true);
//用完删除 QSettings
delete reg;
}
(2)读取注册表
#include <QSettings>
#include <QLabel>
void Widget::readKey()
{
//输出键值
QLabel *label = new QLabel(this);
label->setGeometry(QRect(50,50,200,25));
QLabel *label2 = new QLabel(this);
label2->setGeometry(QRect(50,80,200,25));
//实例 QSettings
//参数 1:如果没有按照章节 Qt01 进行,则注册表中没有 Qt01。
QSettings *reg = new QSettings("HKEY_CURRENT_USER\\Software\\Qt01", QSettings::NativeFormat);
QString ret = reg->value("键名 001").toString();
//判断 value 是否为空,不为空则输出
if(!ret.isEmpty())
{
label->setText("键名 001::"+reg->value("键名 001").toString());
label2->setText("键名 002::"+reg->value("键名 002").toString());
}
else
{
qDebug()<<"键名 001 值为空!";
}
//删除 QSettings
delete reg;
}
运行结果:
(3)修改IE浏览器默认主页
#include <QSettings>
//实例 QSettings
QSettings *reg = new
QSettings("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\Main", QSettings::NativeFormat);
//判断 value 是否为空,不为空则输出
if(reg->value("Start Page") != "")
{
//IE 默认主页修改为:百度首页
reg->setValue("Start Page","http://www.baidu.com");
}
//删除 QSettings
delete reg;