Qt - 文件操作3

news/2024/9/29 19:38:35

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);//用完删除 QSettingsdelete 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 值为空!";}//删除 QSettingsdelete 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;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66284.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

CSP模拟5

T1光 我们来考虑一个格加 \(4\) 或者减 \(4\) ,这样有一个比较好的性质,它能提供 \(4,2,2,1\) 的贡献还不会溢出,这样我们就有一个比较好的思路,我们枚举 \(4,2,2,1\) 所无法造成的贡献,很明显只有 \(16\) 种,然后我们就可以再枚举 \(4,2,2,1\) 来算贡献.点击查看代码 #in…

Qt - 文件操作2

4. QFileInfo 4.1 简介 QFileInfo类提供与系统无关的文件信息,QFileInfo提供了关于文件的名称和在文件系统中的位置(路径)、它的访问权限以及它是目录还是符号链接等信息。文件的大小和最后修改/读取时间也可用。 4.2 常用方法bool isDir() const //.如果该对象…

prometheus学习笔记之alertmanager告警配置

一、安装alertmanager 项目地址:https://github.com/prometheus/alertmanager 帮助文档:https://prometheus.io/docs/alerting/latest/alertmanager/ 配置文档:https://prometheus.io/docs/alerting/latest/configuration/wget https://github.com/prometheus/alertmanager/…

[clickhouse] Clickhouse 关键特性的版本支持与演变

clickhouse 21.10 Feature : UDF用户可通过添加lambda表达式,创建自定义FunctionCREATE FUNCTION linear_equation AS (x, k, b) -> k*x + b; SELECT number, linear_equation(number, 2, 1) FROM numbers(3);CREATE FUNCTION parity_str AS (n) -> if(n % 2, odd, even…

RTE 大会报名丨智能编解码和 AI 生成视频 ,RTE2024 技术专场第五弹!

AI 视频的爆炸增长,给新一代编解码技术提出了什么新挑战?语音 AI 实现 human-like 的最后一步是什么?当大模型进化到实时多模态,又将诞生什么样的新场景和玩法?所有 AI Infra 都在探寻规格和性能的最佳平衡,如何构建高可用的云边端协同架构?AI 加持下,空间计算和新硬件…

在docker安装Python环境提供给其他docker使用

1. 在宿主机新建一个目录 2. 在app目录下新建一个Dockerfile文件 本文永久更新地址:1. 在宿主机新建一个目录 在宿主机上新建一个目录如app/,在app目录里面导入项目需要依赖的包 在项目根目录下输入命令,导出python项目所有的依赖包 pip freeze > requirements.txt把导出的…

南沙C++信奥赛陈老师解一本通题 1942:【08NOIP普及组】ISBN号码

​【题目描述】每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版…