当前位置: 首页 > 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…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法

使用 ROS1-Noetic 和 mavros v1.20.1&#xff0c; 携带经纬度海拔的话题主要有三个&#xff1a; /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码&#xff0c;来分析他们的发布过程。发现前两个话题都对应了同一…...