当前位置: 首页 > news >正文

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文件中去改的,这些键值就是我们设置的对象名,也就是对象查看器那栏的对象名称。因此对象命名好一点对于自己查看是非常有帮助的。
在这里插入图片描述

相关文章:

Qt 快速保存配置的方法

Qt 快速保存配置的方法 一、概述二、代码1. QFileHelper.cpp2. QSettingHelper.cpp 三、使用 一、概述 这里分享一下&#xff0c;Qt界面开发时&#xff0c;快速保存界面上一些参数配置的方法。 因为我在做实验的时候&#xff0c;界面上可能涉及到很多参数的配置&#xff0c;我…...

RKE部署k8s

移除docker&#xff08;非必要&#xff09; rm -rf /etc/docker rm -rf /run/docker rm -rf /var/lib/dockershim rm -rf /var/lib/docker yum list installed | grep docker yum remove ***rke部署k8s集群 cat > /etc/sysctl.conf << EFO net.ipv4.ip_forward 1 n…...

从0开始的STM32HAL库学习8

PWM控制舵机 配置环境 1. 选择TIM2时钟 2.选择内部时钟模式&#xff0c;打开通道二 3.分频系数PSC:72-1 自动重装寄存器ARR:20000-1 输出比较寄存器 CCR:500~2500( 后面可调整 ) 脉冲选择500后期可以改 编辑代码 调用启动函数 HAL_TIM_PWM_Start(&htim2,TIM_CHANN…...

微信小程序数组绑定使用案例(一)

微信小程序数组绑定案例&#xff0c;修改数组中的值 1.Wxml 代码 <view class"list"><view class"item {{item.ischeck?active:}}" wx:for"{{list}}"><view class"title">{{item.name}} <text>({{item.id}…...

Kudu节点数规划

作者&#xff1a;南墨 一、概述 由于Kudu是Hadoop生态的一部分&#xff08;虽然它不依赖于Hadoop生态系统&#xff09;&#xff0c;因此大多数实际应用场景需要的不仅仅是Kudu&#xff1b;为了输入数据&#xff0c;可能需要Kafka、StreamSets或Spark Streaming&#xff1b;对…...

flutter 充电气泡

前言&#xff1a; 之前一直看到 有手机充电的时候 有气泡从Type-C 的位置冒泡上来 慢慢上移&#xff0c; 然后和上面的圆圈 会和&#xff0c;感觉还是挺好看的。今天试了下用 Flutter 实现了一版本。大致效果如下&#xff0c;而且气泡 和 气泡直接还可以粘黏 实现原理&#xff…...

【C++】deque以及优先级队列

容器适配器 deque的介绍deque的原理介绍 priority_queue的介绍与使用priority_queue的介绍priority_queue的使用constructor&#xff08;构造函数&#xff09;emptypushpoptopsize priority_queue的模拟实现 仿函数何为适配器容器适配器deque的缺陷选择deque作为适配器的理由ST…...

手机如何播放电脑的声音?

准备工具&#xff1a; 有线耳机&#xff0c;手机&#xff0c;电脑&#xff0c;远控软件 1.有线耳机插电脑上 2.电脑安装pc版远控软件&#xff0c;手机安装手机端控制版远控软件 3.手机控制电脑开启声音控制 用手机控制电脑后&#xff0c;打开声音控制&#xff0c;电脑播放视频…...

系统架构设计师教程 第3章 信息系统基础知识-3.6 办公自动化系统(OAS)-解读

系统架构设计师教程 第3章 信息系统基础知识-3.6 办公自动化系统&#xff08;OAS&#xff09; 3.6.1 办公自动化系统的概念3.6.1.1 办公活动3.6.1.1 办公自动化的概念 3.6.2 办公自动化系统的功能3.6.2.1 事务处理3.6.2.1.1 单机系统3.6.2.1.2 多机系统 3.6.2.2 信息管理3.6.2.…...

解决Element UI 表格组件懒加载数据刷新问题

一、问题描述 element ui的table组件设置成懒加载时&#xff0c;遇到数据表格需要更新、删除等操作&#xff0c;子节点不会自动更新。 二、解决思路 刷新数据&#xff0c;就是重新调用load&#xff08;&#xff09;&#xff0c;通过map记录已展开的节点&#xff0c;需要刷新…...

【系统架构设计 每日一问】二 MySql主从复制延迟可能是什么原因,怎么解决

主从复制的架构设计如下图所示&#xff1a; 同步原理 具体到数据库之间是通过binlog和复制线程操作的&#xff1a; Master的更新事件(update、insert、delete)会按照顺序写入bin-log中。当Slave连接到Master的后,Master机器会为Slave开启&#xff0c;binlog dump线程,该线程…...

Ubuntu Grub引导优化

配置文件 sudo vim /etc/default/grub修改参数 引导菜单等待时间 GRUB_TIMEOUT3自动引导上次选择的系统 如果安装了双系统或多系统&#xff0c;可以考虑配置此参数。 # 此参数默认值为0&#xff0c;引导第一个引导项 GRUB_DEFAULTsaved# 此参数默认没有&#xff0c;需要手…...

第3关 -- Git 基础知识

任务1: 破冰活动&#xff1a;自我介绍 任务2: 实践项目&#xff1a;构建个人项目 MeiHuaYiShu...

AttributeError: ‘WebDriver‘ object has no attribute ‘find_element_by_xpath‘

问题&#xff1a; 跑之前的python爬虫代码的时候报错 AttributeError: WebDriver object has no attribute find_element_by_xpath 源代码&#xff1a; elements self.driver.find_elements_by_xpath("//tbody[starts-with(id,normalthread)]/tr/th/a[1]")原因&…...

题解:小S与机房里的电脑 Computer_C++算法竞赛_贪心_二分答案_模拟_数据结构

文章目录 小S与机房里的电脑 Computer传统题题目描述输入格式输出格式样例样例输入 1样例输出 1样例输入 2样例输出 2 提示解题思路AC CodeEnd 小S与机房里的电脑 Computer 传统题 时间限制: 1000ms内存限制: 256MiB 题目描述 最近小S想带他的学生打组队娱乐赛&#xff0c;…...

Python @staticmethod、super().__init__()和self

最近在看代码&#xff0c;由于之前没有系统学习过Python&#xff0c;就有些知识点不是很清楚&#xff0c;这里整理一下&#xff0c;方便以后查阅。 Python中的staticmethod\super.init和self Python 装饰器staticmethod和classmethod的作用与区别作用区别代码演示 super() 函数…...

Linux网络:应用层协议HTTP(一)

一、什么是HTTP协议 虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。 在互联网世界中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&…...

Tomcat底层原理

Tomcat是一个开源的Java Servlet容器&#xff0c;它实现了Java Servlet和JavaServer Pages (JSP) 技术&#xff0c;用于运行Java Web应用。它是由Apache软件基金会开发和维护的。以下是对Tomcat底层原理的详细解析&#xff1a; 1. 启动流程 Tomcat的启动流程主要分为以下几个…...

【Linux】Linux环境设置环境变量操作步骤

Linux环境设置环境变量操作步骤 在一些开发过程中本地调试经常需要依赖环境变量的参数&#xff0c;但是怎么设置对小白来说有点困难&#xff0c;今天就介绍下具体的操作步骤&#xff0c;跟着实战去学习&#xff0c;更好的检验自己的技术水平&#xff0c;做技术还是那句话&…...

C语言:键盘录入案例

主要使用了scanf&#xff1b; scanf的使用方法和注意事项&#xff1a; 1.作用&#xff1a; 用于接收键盘输入的数据并赋值给对应的变量 2.使用方式; scanf("占位符",&变量名); 3.注意事项; 占位符后面的的变量要对应 第一个参数中不写换行 案例1&#xf…...

加州DMV十年自动驾驶报告深度解析:从测试数据看行业格局与技术演进

1. 项目概述&#xff1a;一份数据&#xff0c;十年自动驾驶风云如果你关注自动驾驶&#xff0c;那你一定听说过加州车管局&#xff08;DMV&#xff09;的年度测试报告。这玩意儿&#xff0c;可以说是全球自动驾驶行业的“晴雨表”和“成绩单”。从2015年开始&#xff0c;加州就…...

基于事件驱动与SSH的轻量级实时文件同步工具Pynchy详解

1. 项目概述&#xff1a;一个轻量级、高可用的文件同步守护进程最近在折腾个人服务器和开发环境之间的文件同步&#xff0c;试过不少方案&#xff0c;要么太重&#xff0c;要么配置复杂&#xff0c;要么实时性不够。直到我发现了crypdick/pynchy这个项目&#xff0c;它用 Pytho…...

保姆级教程:在Google Colab上用TensorFlow 2.0快速搭建你的第一个ACGAN图像生成器

零门槛实战&#xff1a;用ColabTensorFlow打造你的首个ACGAN数字生成器 想象一下&#xff0c;只需点击几次就能让AI学会生成逼真的手写数字——这不再是实验室里的黑科技。我们将利用Google Colab的免费GPU资源&#xff0c;带你用TensorFlow 2.0快速搭建一个能按需求生成特定数…...

从SMP到NUMA:聊聊多核CPU时代Linux内存管理是怎么‘进化’的

从SMP到NUMA&#xff1a;多核CPU时代的内存管理演进之路 2000年代初&#xff0c;当单核CPU的主频竞赛逐渐触及物理极限时&#xff0c;计算机架构师们面临一个关键抉择&#xff1a;如何在芯片上堆叠更多晶体管&#xff1f;答案最终指向了多核设计。但随之而来的内存访问瓶颈&…...

你的密码正在裸奔!一张RTX 5090,1小时破解60%的MD5密码

网络安全文章 文章目录 网络安全文章前言一、卡巴斯基到底做了什么&#xff1f;1.1 测试环境1.2 测试结果 二、为什么MD5这么脆弱&#xff1f;2.1 MD5设计初衷就不是用来存密码的2.2 MD5 vs bcrypt vs Argon2 对比 三、真实案例&#xff1a;算力平台租卡破解有多便宜&#xff1…...

【ElevenLabs企业级语音AI落地指南】:20年音视频架构师亲授——3大合规陷阱、4类集成断点、1套可审计部署框架

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs Enterprise方案全景认知 ElevenLabs Enterprise 是面向中大型组织构建的语音合成与语音智能平台&#xff0c;提供高保真、低延迟、多语言、可定制的语音生成能力&#xff0c;并深度集成企业…...

别再死记公式了!用Multisim仿真带你玩转反相/同相比例运算电路

用Multisim仿真解锁比例运算电路的实战奥秘 在电子工程的学习中&#xff0c;运算放大器电路一直是让初学者又爱又恨的内容。传统的学习方法往往从公式推导开始&#xff0c;要求学生死记硬背各种电路配置下的增益公式。但今天&#xff0c;我们要打破这种枯燥的学习方式——通过…...

【Gemini赋能Google Maps路线优化实战指南】:20年导航算法专家亲授5大降本增效核心策略

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gemini赋能Google Maps路线优化的底层逻辑与演进脉络 Google Maps 路线规划正经历从传统图算法向多模态智能推理的范式迁移。Gemini 模型并非简单替代 Dijkstra 或 A*&#xff0c;而是作为实时决策中枢…...

【信息科学与工程学】【数据科学】 第三篇 数学基础

数学知识体系:现代核心领域的深度架构 数学知识体系:历史脉络与逻辑结构总览表 时代/脉络​ 核心分支​ 核心概念/定理/理论​ 历史渊源/思想脉络​ 与其他领域的连接​ 数学哲学/元视角​ 1. 古典起源与奠基 (公元前 ~ 16世纪)​ 算术​ 自然数、素数、整除、欧几里…...

Linux I2C设备驱动避坑指南:以MPU6050为例,解决i2c_transfer返回EIO错误

Linux I2C设备驱动深度排障&#xff1a;MPU6050的EIO错误全解析 调试嵌入式设备时&#xff0c;最令人沮丧的莫过于那些间歇性出现的错误。它们像幽灵一样时隐时现&#xff0c;让开发者陷入无尽的猜测和试错循环。MPU6050作为一款广泛使用的运动传感器&#xff0c;其I2C接口的稳…...