首页 > 其他分享 >Qt - 文件操作3

Qt - 文件操作3

时间:2024-09-29 19:48:16浏览次数:1  
标签:文件 QSettings const Qt void value QString 操作 reg

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;

 

标签:文件,QSettings,const,Qt,void,value,QString,操作,reg
From: https://www.cnblogs.com/zhuchunlin/p/18440625

相关文章

  • Qt - 文件操作2
    4.QFileInfo4.1简介QFileInfo类提供与系统无关的文件信息,QFileInfo提供了关于文件的名称和在文件系统中的位置(路径)、它的访问权限以及它是目录还是符号链接等信息。文件的大小和最后修改/读取时间也可用。4.2常用方法 boolisDir()const//.如果该对象......
  • notepad++安装HexEditor插件查看二进制文件
    notepad++安装HexEditor插件查看二进制文件前言有时候我们需要分析二进制文件,但是分析二进制文件直接用编辑器查看会出现乱码的情况,本文在notepad++软件上安装一个HexEditor插件,可方便分析二进制文件。一、下载HexEditor插件打开下面的网址,下载HexEditor插件https://sou......
  • 亲测有效,4个微信过期或被清理文件恢复方法
    如今,无论是学习还是工作我们都离不开微信,微信的出现改变了人们的社交方式。也正是因为微信,人们之间的交流变得更加便捷与多样化。但随着交流的增加,微信的数据越来越多,手机储存空间告急,我们便会去清理,删除一些琐碎的数据。但遗憾的是,我们很难避免误删一些重要文件。或者有些......
  • neo4j 统计多个节点之间关系总和的写法-包含多个collect合并成一个并去重操作
    在使用neo4j数据库时,会遇到计算与指定节点产生关联的数量统计需求,例如指定6个节点1,2,3,4,5,6需要找出与这6个节点中4个节点有关联的节点(要求排除这6个节点的数据)先看实现查询语句:MATCH(start:person_info)-[r1]-(n)-[r2]-(end:person_info)WHEREstart.persocountIdin['1......
  • 《最终幻想16》游戏启动时崩溃弹窗“找不到api-ms-win-core-com-l1-1-0.dll”文件该怎
    当启动《最终幻想16》时,游戏崩溃并弹窗显示“找不到api-ms-win-core-com-l1-1-0.dll”文件,这严重影响了游戏体验。现在为您细致剖析修复此问题的具体方法,助您顺利解决,畅玩游戏。本篇将为大家带来《最终幻想16》游戏启动时崩溃弹窗“找不到api-ms-win-core-com-l1-1-0.dll”文件......
  • 《地狱之刃2:塞娜的史诗》游戏启动时崩溃黑屏弹窗“找不到api-ms-win-core-console-l1-
    在启动《地狱之刃2:塞娜的史诗》时,崩溃黑屏并弹窗显示“找不到api-ms-win-core-console-l1-2-0.dll”文件,这十分棘手。此问题的解决可能需要特定操作。现在为您详细讲解解决办法,助您摆脱这一困境。本篇将为大家带来《地狱之刃2:塞娜的史诗》游戏启动时崩溃黑屏弹窗“找不到api-ms......
  • 《活侠传》游戏启动时闪退提示“找不到kernel32.dll”文件该怎么处理?活侠传游戏崩溃弹
    玩《活侠传》时,游戏启动就闪退,还提示“找不到kernel32.dll”文件,实在让人烦恼。此问题的解决或许有一定难度。现在为您仔细阐述处理这种情况的有效办法,助您解决难题,顺利开启游戏。本篇将为大家带来《活侠传》游戏启动时闪退提示“找不到kernel32.dll”文件该怎么处理的内容,......
  • 《仙剑客栈2》报错提示eutil.dll缺失?解决《仙剑客栈2》eutil.dll文件的重要性与补充方
    《仙剑客栈2》报错提示eutil.dll缺失是一个常见的问题,这通常意味着游戏在运行时无法找到必要的动态链接库文件(DLL)。eutil.dll文件在Windows操作系统中扮演着至关重要的角色,为应用程序提供必要的函数和数据支持。以下是解决《仙剑客栈2》eutil.dll文件缺失问题的重要性与补充方......
  • 使用python语言进行文件复制
    importos.path#来源文件sc_file=r"D:\py\test1"#目标文件des_file=r"D:\py\test2"#定义函数defcopy(sc,des):#判断来源文件是否为文件夹ifos.path.isdir(sc):#列出当前文件夹下的所有文件files=os.listdir(sc)#......
  • 使用异或操作实现字符串加密与解密
    异或加密是一种简单而有效的加密技术,它的特点是同一密钥可用于加密和解密,以下是一个例子:usingSystem;usingSystem.Text;publicstaticclassEncryption{///<summary>///bytes数据通过encryptCode进行异或(加密|解密)///将传入的bytes作为返回值,不再额外分......