Qt 快速保存配置的方法

Qt 快速保存配置的方法

  • 一、概述
  • 二、代码
    • 1. QFileHelper.cpp
    • 2. QSettingHelper.cpp
  • 三、使用

一、概述

这里分享一下,Qt界面开发时,快速保存界面上一些参数配置的方法。

因为我在做实验的时候,界面上可能涉及到很多参数的配置,我也不大可能自己去记录每一个参数的值,不保存这些,下次启动的时候要自己手输就非常浪费时间,因此我用了Qt的Meta-Object 系统,结合了ObjectName,把配置保存为json文本。这就非常方便的实现了我想要的功能。

二、代码

1. QFileHelper.cpp

这个函数就是保存和读写文本的通用配置,在写文件的时候,不存在目录的文件也会先创建目录文件的父目录再去写。

bool QFileHelper::writeAllText(const QString &fileName, QString &text)
{QFile file(fileName);QDir dir(fileName);QString parentPath = dir.absolutePath().replace(dir.absolutePath().split("/", QString::SkipEmptyParts).last(), "");if(!dir.exists(parentPath)){if(!dir.mkdir(parentPath)){return false;}}if (!file.open(QIODevice::WriteOnly | QIODevice::Text))return false;QTextStream in(&file);in.setCodec("utf-8");in<<text;QSettingHelper::Instance()->setLastOpenFileDir(QFileInfo(fileName).dir().absolutePath());file.close();return true;
}bool QFileHelper::readAllText(const QString &fileName, QString &text)
{QFile file(fileName);if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return false;QTextStream in(&file);in.setCodec("utf-8");text = in.readAll();QSettingHelper::Instance()->setLastOpenFileDir(QFileInfo(fileName).dir().absolutePath());file.close();return true;
}

2. QSettingHelper.cpp

定义了保存、加载配置的宏,配置文件我是放在 当前应用程序的/config/源文件结构.config

每一个文件用了这个宏都会根据 源文件名(包含路径) 去保存里面的QSPBox、QDoubleSPbox的值。

下面目前没有保存 QLineEdit的值,但是可以继续扩展。

#include <common/QFileHelper.h>
#include <QJsonDocument>
#include <QJsonObject>
#include <QCoreApplication>
#include <QSpinBox>
#include <QDoubleSpinBox>#define LOADCONFIG() \
{\QString json;\QString fileName = QCoreApplication::applicationDirPath() + "/configs/" + QString(__FILE__).split(".")[0] + ".config";\if(QFileHelper::readAllText(fileName, json )){\QJsonDocument jsDoc  = QJsonDocument::fromJson(json.toUtf8());\QJsonObject jsObj = jsDoc.object();\QDoubleSpinBox * d_spbox = nullptr;\QSpinBox * spbox = nullptr;\for(auto it : jsObj.keys()){\QObject * obj = this->findChild<QObject *>(it);\if(!obj) continue;\if(d_spbox = qobject_cast<QDoubleSpinBox*>(obj)){\d_spbox->setValue(jsObj.value(d_spbox->objectName()).toDouble());\}\if(spbox = qobject_cast<QSpinBox*>(obj)){\spbox->setValue(jsObj.value(spbox->objectName()).toInt());\}\}\}\
}#define SAVECONFIG() \
{\QString fileName = QCoreApplication::applicationDirPath() + "/configs/" + QString(__FILE__).split(".")[0] + ".config";\QList<QSpinBox *> spbox_list = this->findChildren<QSpinBox *>();\QList<QDoubleSpinBox *> double_spbox_list = this->findChildren<QDoubleSpinBox *>();\QJsonObject jsObj;\for(auto it : spbox_list ){\jsObj.insert(it->objectName(), it->value());\}\for(auto it : double_spbox_list){\jsObj.insert(it->objectName(), it->value());\}\QJsonDocument jsDoc(jsObj);\QString json =  jsDoc.toJson();\if(QFileHelper::writeAllText(fileName,  json)){\}else{\}\
}

三、使用

因为我只是在构造和析构的时候用了,当然你可以自己定时去保存都可以。

ShapeDetectionWG::ShapeDetectionWG(QWidget *parent) :QWidget(parent),ui(new Ui::ShapeDetectionWG)
{ui->setupUi(this);ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);qRegisterMetaType<Surface_mesh>("Surface_mesh&");//构造函数加载配置LOADCONFIG();
}ShapeDetectionWG::~ShapeDetectionWG()
{//析构前保存配置SAVECONFIG();delete ui;
}

保存的效果如下
在这里插入图片描述
在子目录下也会有对应的配置
在这里插入图片描述
保存的配置如下这种:
在这里插入图片描述
如下图所示,我是在ui文件中去改的,这些键值就是我们设置的对象名,也就是对象查看器那栏的对象名称。因此对象命名好一点对于自己查看是非常有帮助的。
在这里插入图片描述

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

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

相关文章

鼠标的发明和鼠标“变形记”

注&#xff1a;机翻&#xff0c;未校对。 Who Invented the Computer Mouse? 谁发明了电脑鼠标&#xff1f; It was technology visionary and inventor Douglas Engelbart (January 30, 1925 – July 2, 2013) who revolutionized the way computers worked, turning it fr…

【数据结构】--- 顺序表

目录 前言&#xff1a; 顺序表 动态顺序表的实现 代码总览&#xff1a; 前言&#xff1a; 数据结构是由“数据”和“结构”两词组合而来。 什么是数据&#xff1f; 常见的数值1、2、3、4.....、教务系统⾥保存的⽤⼾信息&#xff08;姓名、性别、年龄、…

Kafka Producer之ACKS应答机制

文章目录 1. 应答机制2. 等级03. 等级14. 等级all5. 设置等级6. ISR 1. 应答机制 异步发送的效率高&#xff0c;但是不安全&#xff0c;同步发送安全&#xff0c;但是效率低。 无论哪一种&#xff0c;有一个关键的步骤叫做回调&#xff0c;也就是ACKS应答机制。 其中ACKS也分…

Qt QProcess 进程间通信读写数据通信

本文介绍了如何使用Qt的QProcess 进行程序开发&#xff0c;包括启动进程间通信、设置环境变量、通用方法&#xff1b;方便在日常开发中使用&#xff1b; 1.使用Qt进行程序开发&#xff0c;可以通过QProcess类用于启动外部程序并与其进行通信.&#xff1b; 进程A&#xff08;…

CentOS 7 安装MySQL 5.7.30

CentOS 7 安装MySQL卸载&#xff08;离线安装&#xff09; 安装配置MySQL之前先查询是否存在&#xff0c;如存在先卸载再安装 rpm -qa|grep -i mysql rpm -qa|grep -i mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64如下命令找到直接 rm -rf 删除&#xff08;删除…

代理IP服务中的代理池大小有何影响?

在当今数字化时代&#xff0c;网络爬虫已经成为获取各类信息必不可少的工具。在大规模数据抓取中&#xff0c;使用单一 IP 地址或同一 IP 代理往往会面临抓取可靠性降低、地理位置受限、请求次数受限等一系列问题。为了克服这些问题&#xff0c;构建代理池成为一种有效的解决方…

Java基础笔记(面试题)

一、Tomcat中为什么要使用自定义类加载器 Tomcat中可以放多个Java项目的jar文件&#xff0c;如果每个jar文件中都有一个User的类&#xff0c;那么User类在没有自定义类加载器的情况下是只能加载一次&#xff1b;想要加载多次&#xff0c;只能自定义类加载器 二、JDK、JRE、JVM…

【leetcode】 字符串相乘(大数相乘、相加)

记录一下大数相乘相加方法&#xff1a; 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: nu…

基于嵌入式Linux的高性能车载娱乐系统设计与实现 —— 融合Qt、FFmpeg和CAN总线技术

随着汽车智能化的发展&#xff0c;车载娱乐系统已成为现代汽车的标配。本文介绍了一个基于Linux的车载娱乐系统的设计与实现过程。该系统集成了音视频娱乐、导航、车辆信息显示等功能&#xff0c;旨在提供安全、便捷、丰富的驾驶体验。 1. 项目概述 随着汽车智能化的发展&…

Java对象转换为JSON字符串

0 写在前面 业务中有很多场景需要 把一个带有数据的 Java对象/Java集合转换为JSON 存入数据库中。 在需要的时候还需要吧和这个JSON字符串拿出来再次转换成Java对象/集合 1 Java对象与JSON字符串互转 引入依赖: <dependency><groupId>com.alibaba</groupId&…

【5G Sub-6GHz模块】专为IoT/eMBB应用而设计的RG520NNA、RG520FEB、RG530FNA、RG500LEU 5G模组

推出全新的5G系列模组&#xff1a; RG520NNADB-M28-SGASA RG520NNADA-M20-SGASA RG520FEBDE-M28-TA0AA RG530FNAEA-M28-SGASA RG530FNAEA-M28-TA0AA RG500LEUAA-M28-TA0AA ——明佳达 1、5G RG520N 系列——专为IoT/eMBB应用而设计的LGA封装模块 RG520N 系列是一款专为 IoT…

内容安全(深度行为检测技术、IPS、AV、入侵检测方法)

1、深度行为检测技术 深度行为检测技术&#xff1a;是一种基于深度学习和机器学习的技术&#xff0c;它通过分析用户在网络中的行为模式&#xff0c;识别异常或潜在威胁行为&#xff0c;从而保护网络安全和内容安全 分类&#xff1a; 深度包检测技术&#xff08;Deep Packet…

【Redis7】高阶篇

1 Redis单线程 VS 多线程(入门篇) 1.1 面试题 redis到底是单线程还是多线程&#xff1f; IO多路复用听说过吗&#xff1f; redis为什么快&#xff1f; 1.2 Redis为什么选择单线程&#xff1f; 1.2.1 是什么 这种问法其实并不严谨&#xff0c;为啥这么说呢? Redis的版本…

通用图形处理器设计GPGPU基础与架构(四)

一、前言 本文将介绍GPGPU中线程束的调度方案、记分牌方案和线程块的分配与调度方案。 二、线程束调度 在计算机中有很多资源&#xff0c;既可以是虚拟的计算资源&#xff0c;如线程、进程或数据流&#xff0c;也可以是硬件资源&#xff0c;如处理器、网络连接或 ALU 单元。调…

【DGL系列】DGLGraph.out_edges简介

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 函数说明 用法示例 示例 1: 获取所有边的源节点和目标节点 示例 2: 获取特定节点的出边 示例 3: 获取所有边的边ID 示例 4: 获取所有信息&a…

PyTorch张量索引

文章目录 1、简介1.1、基本概念1.2、索引类型1.3、数据准备1.4、技术摘要⭐ 2、简单行、列索引3、列表索引4、范围索引5、布尔索引6、多维索引 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#…

未来的社交标杆:如何通过AI让Facebook更加智能化?

在当今信息爆炸的时代&#xff0c;社交媒体平台的智能化已成为提高用户体验和互动质量的关键因素。Facebook&#xff0c;作为全球最大的社交平台之一&#xff0c;通过人工智能&#xff08;AI&#xff09;的广泛应用&#xff0c;正不断推进其智能化进程。本文将探讨Facebook如何…

Postman安装使用教程(详解)

目录 一、Postman是什么 二、安装系统要求 三、下载Postman 四、注册和登录Postman 五、创建工作空间 六、创建请求 一、Postman是什么 在安装之前&#xff0c;让我们先来简单了解一下Postman。Postman是一个流行的API开发工具&#xff0c;它提供了友好的用户界面用于发送…

web安全之跨站脚本攻击xss

定义: 后果 比如黑客可以通过恶意代码,拿到用户的cookie就可以去登陆了 分类 存储型 攻击者把恶意脚本存储在目标网站的数据库中(没有过滤直接保存)&#xff0c;当用户访问这个页面时&#xff0c;恶意脚本会从数据库中被读取并在用户浏览器中执行。比如在那些允许用户评论的…

llama-index,uncharted and llama2:7b run locally to generate Index

题意&#xff1a;本地运行 llama-index、uncharted 以及 llama2:7b 来生成索引 问题背景&#xff1a; I wanted to use llama-index locally with ollama and llama3:8b to index utf-8 json file. I dont have a gpu. I use uncharted to convert docs into json. Now If it …