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)
  • 将组重置为相应beginGroup()调用之前的值。

 
 
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文件

操作文件,无非就是读与写,以下为QSettings读写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;

 

posted @ 2024-09-29 19:36  [BORUTO]  阅读(23)  评论(0编辑  收藏  举报