Qt 快速保存配置的方法

一、概述

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

相关推荐

  1. Qt保存和还原Widget状态入门指南

    2024-07-18 13:50:02       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 13:50:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 13:50:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 13:50:02       57 阅读
  4. Python语言-面向对象

    2024-07-18 13:50:02       68 阅读

热门阅读

  1. 1.1 系统架构概述

    2024-07-18 13:50:02       18 阅读
  2. live555 rtsp服务器实战之doGetNextFrame

    2024-07-18 13:50:02       21 阅读
  3. 依赖倒置原则

    2024-07-18 13:50:02       18 阅读
  4. Python使用队列在两个线程中传递数据

    2024-07-18 13:50:02       18 阅读
  5. STM32判断休眠

    2024-07-18 13:50:02       20 阅读
  6. Spring boot 2.0 升级到 3.3.1 的相关问题 (四)

    2024-07-18 13:50:02       16 阅读
  7. Miniforge 安装器

    2024-07-18 13:50:02       20 阅读
  8. 基于opencv的图片加水印实现方案

    2024-07-18 13:50:02       20 阅读
  9. redis知多少

    2024-07-18 13:50:02       21 阅读
  10. 【LeetCode 0069】【二分查找】求平方根

    2024-07-18 13:50:02       22 阅读