QSettings使用笔记

embedded/2024/9/24 1:45:15/

一、代码之路

日常中,我们会使用QSettings来读取配置文件中的数据信息或者是注册表中的键值对信息,如下方代码:

QString strFilePath = "D:/my.ini";
QSettings sysSettings(strFilePath, QSettings::IniFormat);
sysSettings.setIniCodec("UTF-8");
sysSettings.beginGroup("MyInfo");
strHost = sysSettings.value("Name").toString();
strPort = sysSettings.value("Age").toString();
sysSettings.endGroup();

但是如果我们只是QSettings对象来存储数据,如下方代码中getMyInfo方法将自己的数据信息存储在QSettings对象中,但是我们发现在test方法中我们使用qDebug打印出来的名字和年龄都是空值。

Name: “” Age: 0

QSettings* getMyInfo(QString name, int age)
{QSettings* settings = new QSettings();settings->setValue("Name", name);settings->setValue("Age", age);return settings;
}void testSettings()
{QSettings* mySettings = getMyInfo("小明", 18);QString name = mySettings->value("Name").toString();int age = mySettings->value("Age").toInt();qDebug() << "Name:" << name << " Age:" << age;
}

那么原因出在哪里呢?
简单看下Qt助手中这段解释说明:

QSettings objects can be created either on the stack or on the heap (i.e. using new). Constructing and destroying a QSettings object is very fast.
If you use QSettings from many places in your application, you might want to specify the organization name and the application name using QCoreApplication::setOrganizationName() and QCoreApplication::setApplicationName(), and then use the default QSettings constructor:

QCoreApplication::setOrganizationName("MySoft");
QCoreApplication::setOrganizationDomain("mysoft.com");
QCoreApplication::setApplicationName("Star Runner");
...
QSettings settings;

如果我们需要使用QSettings的默认构造函数,需要调用下面的代码,设置全局的OrganizationName:

QCoreApplication::setOrganizationName("MySoft");
QSettings* settings = new QSettings("MySoft");

注意点:

如果没有全局设置OrganizationName,我们可以在QSettings构造方法中传入OrganizationName,下面代码中我们稍加修改,在getMyInfo方法中我们直接在栈上创建QSettings对象(即局部变量,会在函数结束后销毁),然后我们在testSettings方法中直接在QSettings对象中传入相同的OrganizationName,然后依旧可以输出我们传入的值,说明可以直接通过指定OrganizationName来创建一个全局的QSettings数据对象。

void getMyInfo(QString name, int age)
{QSettings settings("MySoft");settings.setValue("Name", name);settings.setValue("Age", age);
}void testSettings()
{// 这里直接调用;getMyInfo("小明", 18);// 这里也是在构造中指定getMyInfo方法中同样的OrganizationName;QSettings mySettings("MySoft");QString name = mySettings.value("Name").toString();int age = mySettings.value("Age").toInt();qDebug() << "Name:" << name << " Age:" << age;
}

那我们是不是可以通过指定不同的OrganizationName,来创建多个全局的QSettings数据对象呢,来看下方测试代码:

void testSettings()
{// 测试数据{QSettings settings("MySoft1");settings.setValue("Name", "小明");settings.setValue("Age", 18);QSettings settings1("MySoft2");settings1.setValue("Name", "小李");settings1.setValue("Age", 20);  }{QSettings mySettings1("MySoft1");QString name = mySettings1.value("Name").toString();int age = mySettings1.value("Age").toInt();qDebug() << "Name:" << name << " Age:" << age;}{QSettings mySettings2("MySoft2");QString name = mySettings2.value("Name").toString();int age = mySettings2.value("Age").toInt();qDebug() << "Name:" << name << " Age:" << age;}
}

输出结果:

Name: “小明” Age: 18
Name: “小李” Age: 20

通过测试,证明了我们的猜想。

其实这里除了OrganizationName之外,还有另外一个参数ApplicationName可以设置,请看下方测试代码:

void testSettings()
{{QSettings settings("MySoft", "Test1");settings.setValue("Name", "小明");settings.setValue("Age", 18);QSettings settings1("MySoft", "Test2");settings1.setValue("Name", "小李");settings1.setValue("Age", 20);}{QSettings mySettings1("MySoft", "Test1");QString name = mySettings1.value("Name").toString();int age = mySettings1.value("Age").toInt();qDebug() << "Name:" << name << " Age:" << age;}{QSettings mySettings2("MySoft", "Test2");QString name = mySettings2.value("Name").toString();int age = mySettings2.value("Age").toInt();qDebug() << "Name:" << name << " Age:" << age;}{// 这里特意增加了ApplicationName为Test3,实际未设置过ApplicationName为Test3QSettings mySettings3("MySoft", "Test3");QString name = mySettings3.value("Name").toString();int age = mySettings3.value("Age").toInt();qDebug() << "Name:" << name << " Age:" << age;}
}

实际输出:

Name: “小明” Age: 18
Name: “小李” Age: 20
Name: “小明” Age: 18

从测试结果中看到,可以通过OrganizationName和ApplicationName组合进行使用,获取到不同的QSettings配置信息;
同时我特意增加了一组QSettings mySettings3(“MySoft”, “Test3”);测试数据,这里并未设置ApplicationName为Test3对应的数据,这里可以从源码中来寻找更加准确的答案,这里我们通过测试数据来得出的信息,源码的逻辑才是更加正确的。


http://www.ppmy.cn/embedded/115842.html

相关文章

操作系统 | 学习笔记 | | 王道 | 5.1 I/O管理概述

5.1 I/O管理概述 5.1.1 I/O设备 注&#xff1a;块设备可以寻址&#xff0c;但是字符设备是不可寻址的 I/O设备是将数据输入到计算机中&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件&#xff1b; 设备的分类 按使用特性分类&#xff…

VM虚拟机下载以及激活

传统的官网已经找不到下载了&#xff0c;这里我将下载好的放在阿里云盘&#xff0c;百度云盘太慢了&#xff0c;懂得都得 阿里云盘分享 下载好了后会是一个exe文件&#xff0c;直接双击运行就可 下载无脑下一步即可&#xff0c;这里不做介绍 下载好了后&#xff0c;需要密钥这里…

【AI视觉平台搭建】概况了解

【AI视觉平台搭建】概况了解 【AI视觉平台搭建】概况了解 文章目录 【AI视觉平台搭建】概况了解1. 需求分析2. 技术选型3. 数据准备4. 模型开发5. 模型评估6. 系统架构搭建7. 部署与监控8. 维护与更新9. 安全与合规10. 文档与培训总结 1. 需求分析 目标设定&#xff1a;明确平…

.env文件详解(vite项目全局配置文件)

.env文件是一个用于存储环境变量的文件。在开发和部署应用程序时,经常需要在不同的环境中配置不同的变量,例如 API 地址、数据库连接信息、密钥等。在许多应用程序中,.env 文件通常包含一个或多个键值对,用于存储环境变量。 Vite 中的 .env 文件还可以用于配置构建时的变量…

【算法】队列与BFS

【ps】本篇有 4 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;N 叉树的层序遍历 .1- 题目解析 .2- 代码编写 2&#xff09;二叉树的锯齿形层序遍历 .1- 题目解析 .2- 代码编写 3&#xff09;二叉树最大宽度 .1- 题目解析 .2- 代码编写 4&#xf…

【Android】sendevent和getevent

在之前我们讨论了通过input命令&#xff0c;外接输入设备&#xff08;鼠标&#xff09;等方式来实现对屏幕的事件注入&#xff0c;达到实现一些自动化的操作&#xff0c;相对于input命令需要获取inputManager来进行操作&#xff0c;sendevent的方式直接写文件来注入粗糙的事件&…

如何登录通义灵码,快速开启AI编码之旅?

通义灵码个人版开发者可以使用阿里云账号登录通义灵码 IDE 端插件&#xff0c;本文介绍个人版开发者登录 IDE 端插件的操作指南。 登录通义灵码 步骤 1&#xff1a;准备工作 已成功注册阿里云账号&#xff0c;具体操作可参考&#xff1a;账号注册&#xff08;PC端&#xff09;…

Centos Stream 9根目录扩容

要将 sda 的剩余空间扩展给 cs-root&#xff0c;可以按照以下步骤进行操作。假设你已经有剩余的未分配空间在 sda 上。 步骤 1&#xff1a;查看当前磁盘分区情况 首先&#xff0c;确保你有未分配的空间在 sda 上。 lsblk步骤 2&#xff1a;创建新的分区 使用 fdisk 或 par…