Qt 快速保存配置的方法

news2025/2/24 3:22:16

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://www.coloradmin.cn/o/1933272.html

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

相关文章

FastAPI 学习之路(五十六)将token缓存到redis

在之前的文章中&#xff0c;FastAPI 学习之路&#xff08;二十九&#xff09;使用&#xff08;哈希&#xff09;密码和 JWT Bearer 令牌的 OAuth2&#xff0c;FastAPI 学习之路&#xff08;二十八&#xff09;使用密码和 Bearer 的简单 OAuth2&#xff0c;FastAPI 学习之路&…

【笔记】一起齿轮箱的故障和相应的数学模拟实验

1.齿轮箱故障一例 出处&#xff1a;设备的故障识别 GearBox的频谱图&#xff0c;原作者不知道是从哪里拷贝来的&#xff0c;待会儿确认一下。 齿轮啮合频率GMF等于齿数乘以齿轮转速频率&#xff1a; ★齿轮啮合频率两边有边频&#xff0c;间距为1X&#xff08;这是由冲击响应…

游泳溺水智能监测报警摄像机

当今社会&#xff0c;游泳已经成为人们重要的休闲活动之一。然而&#xff0c;溺水事故时有发生&#xff0c;尤其是在公共泳池或开放水域。为了提高游泳安全&#xff0c;智能监测技术的应用变得尤为重要。本文将探讨一种创新的游泳溺水智能监测报警摄像机系统&#xff0c;旨在有…

git使用以及理解

git练习网站 Learn Git Branching git操作大全Oh Shit, Git!?! git commit git branch name git merge bugFix 合并俩个分支 git rebase main git checkout headgit switch head 会导致HEAD分离 &#xff0c;就是指head->HEAD->c1 相对引用 ------------------- …

PDF文件无法编辑?3步快速移除PDF编辑限制

正常来说,我们通过编辑器打开pdf文件后,就可以进行编辑了&#xff61;如果遇到了打开pdf却不能编辑的情况,那有可能是因为密码或是扫描件的原因&#xff61;小编整理了一些pdf文件无法编辑&#xff0c;以及pdf文件无法编辑时我们要如何处理的方法&#xff61;下面就随小编一起来…

WEB前端06-BOM对象

BOM浏览器对象模型 浏览器对象模型&#xff1a;将浏览器的各个组成部分封装成对象。是用于描述浏览器中对象与对象之间层次关系的模型&#xff0c;提供了独立于页面内容、并能够与浏览器窗口进行交互的对象结构。 组成部分 Window&#xff1a;浏览器窗口对象 Navigator&…

Human Serum Amyloid A1 ELISA试剂盒

走近指标&#xff1a;Serum Amyloid A1&#xff08;SAA1&#xff09; &#xff08;Human SAA1 结构图&#xff0c;参考网址https://www.rcsb.org/structure/4IP9&#xff09; 血清淀粉样蛋白 A1&#xff08;SAA1&#xff09;是一种由SAA1基因编码的蛋白质&…

用Docker来开发

未完成。。。 现在好像用Docker是越来越多了。之前其实也看过docker的原理&#xff0c;大概就是cgroup那些&#xff0c;不过现在就不看原理了&#xff0c;不谈理论&#xff0c;只看实际中怎么用&#xff0c;解决眼前问题。 用docker来做开发&#xff0c;其实就是解决的编译环境…

Word文档恢复竟然这么简单?3个推荐方案送上!

“我很喜欢用Word进行文字创作&#xff0c;可是我有一次重新打开我的Word文档&#xff0c;却显示文档已丢失&#xff0c;这该怎么办呢&#xff1f;凝聚我多年心血的文章还有可能恢复吗&#xff1f;” 不论是总结学习内容还是汇报工作成果&#xff0c;我们总会用上Word。Word作…

[C++基础]构造函数和析构函数

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到C探索系列 作为一个程序员你不能不掌握的知识 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭建个人网站…

继承和多态常见的面试问题

文章目录 概念问答 概念 下面哪种面向对象的方法可以让你变得富有( A) A: 继承 B: 封装 C: 多态 D: 抽象 (D )是面向对象程序设计语言中的一种机制。这种机制实现了方法的定义与具体的对象无关&#xff0c; 而对方法的调用则可以关联于具体的对象。 A: 继承 B: 模板 C: 对象的…

关于hash的面试题

目录 题目1.java里&#xff0c;HashMap的底层实现原理2.如何判断一个HashMap是否已经满了?3.HashSet如何检查重复4.HashSet如何判断一个元素是否已经存在.简单的理解hash 题目 选自牛客网 1.java里&#xff0c;HashMap的底层实现原理 数组结构&#xff1a;HashMap 使用一个数…

vue2导入elementui组件库

第一步安装 npm i element-ui -S 第二步在main.js中导入 第三步使用然后在运行项目

【合集】临时邮箱网站 临时邮箱API(持续更新)

众所周知&#xff0c;在注册一些账户时&#xff0c;比较常见的验证方式就是邮箱&#xff0c;但是在进行一些小众和不知名网站注册时&#xff0c;邮箱的泄露可能预示着不休止的邮件推送。尤其是当我们只是想临时使用邮箱这种情况&#xff0c;第二种&#xff0c;批量注册账号的情…

vue3前端开发-执行npm run dev提示报错怎么解决

vue3前端开发-执行npm run dev提示报错怎么解决&#xff01;今天在本地安装初始化了一个vue3的案例demo。但是当我执行npm run dev想启动它时报错了说&#xff0c;找不到dev。让我检查package.json文件是否包含dev。如下图所示&#xff1a; 实际上&#xff0c;不必惊慌&#xf…

视频压縮大小不影响画质,视频压缩大小不影响画质的软件

在数字化浪潮推动下&#xff0c;视频制作和分享已成为我们生活的一部分。然而&#xff0c;视频文件体积过大常常让分享和存储变得头疼。今天&#xff0c;我们就来聊聊如何在苹果电脑上压缩视频文件大小&#xff0c;让你的视频瞬间瘦身&#xff01; 方法一、 1.下载并安装视频压…

AgentGYM:结合模仿学习和探索学习策略,让智能体不再需要人类的帮助,在各种环境和任务中自我进化

AgentGYM&#xff1a;结合模仿学习和探索学习策略&#xff0c;让智能体不再需要人类的帮助&#xff0c;在各种环境和任务中自我进化 提出背景AgentGYM 框架AgentGYM 解法拆解AgentEVOL 自我进化算法子解法1&#xff1a;行为克隆子解法2&#xff1a;探索子解法3&#xff1a;学习…

简单搭建卷积神经网络实现手写数字10分类

搭建卷积神经网络实现手写数字10分类 1.思路流程 1.导入minest数据集 2.对数据进行预处理 3.构建卷积神经网络模型 4.训练模型&#xff0c;评估模型 5.用模型进行训练预测 一.导入minest数据集 MNIST--->raw--->test-->(0,1,2...) 10个文件夹 MNIST--->raw-…

爬虫与 Zapier 集成

利用与 Zapier 集成的爬虫 API&#xff0c;以最小的工作量自动完成数据收集、处理和报告等复杂任务。 什么是 Zapier? Zapier 是一家为网络应用程序提供集成的公司&#xff0c;可用于自动化工作流程。 无代码集成 爬虫 API 集成无需编码&#xff0c;您只需点击几下&#x…

ERR SELECT is not allowed in cluster mode

在redis集群模式下&#xff0c;默认且只能使用0号database库&#xff0c;不允许使用SELECT 操作选择database 。