QSettings用法实战(相机配置文件的写入和读取)

news2025/4/2 7:10:15

很多情况,在做项目开发的时候,将参数独立出来是比较好的方法
例如:相机的曝光次数、曝光时长等参数,独立成ini文件,用户可以在外面修改即可生效,无需在动代码重新编译等工作
QSettings便可以实现该功能

内容:用户在UI界面输入相机的曝光时间、次数,点击保存,生成camera.ini配置文件,下次点击加载时自动加载并使用

一、新建项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
项目结构如下:
在这里插入图片描述
页面布局如下:
在这里插入图片描述
稍微美化一下:
在这里插入图片描述

这个Qt生成的UI类名称在这里可以修改
在这里插入图片描述

二、QSettingsStudy.h

1,出于习惯,我将类放在了beyondyanyu命名空间下
2,相机配置文件包含曝光次数number_和曝光时间timer_
3,配置文件存放的路径为config_path_
4,两个button(保存加载)对应两个槽函数(on_pushButton_save_clickedon_pushButton_load_clicked

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QSettingsStudy.h"

namespace beyondyanyu
{
    class QSettingsStudy : public QMainWindow
    {
        Q_OBJECT

    public:
        QSettingsStudy(QWidget* parent = nullptr);
        ~QSettingsStudy();

        int number_ = 0;
        double timer_ = 0.0;
        QString config_path_ = "./setting/camera_param.ini";

    private:
        Ui::QSettingsStudyClass ui;

        void on_pushButton_save_clicked();
        void on_pushButton_load_clicked();
    };
}

三、main.cpp

1,因为我用到了命名空间,故这里Qt的UI类需要注意一下,也要添加命名空间beyondyanyu::QSettingsStudy w;

#include "QSettingsStudy.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    beyondyanyu::QSettingsStudy w;
    w.show();
    return a.exec();
}

四、QSettingsStudy.cpp

1,连接信号和槽
保存配置文件和加载配置文件
connect(ui.pushButton_save, &QPushButton::clicked, this, &QSettingsStudy::on_pushButton_save_clicked);
connect(ui.pushButton_load, &QPushButton::clicked, this, &QSettingsStudy::on_pushButton_load_clicked);

2,保存配置文件
①创建QSettings对象settings,保存的类型为ini格式
QSettings settings(config_path_, QSettings::IniFormat);
②开始组,需要起个组名:settings.beginGroup("Parameters");
③成员,键值对显示出现:
settings.setValue("exposureNum", number_); // 曝光次数
settings.setValue("exposureTime", timer_); // 曝光时间
④结束组:settings.endGroup();
⑤查看setting的状态是否正常
QSettings::NoError

3,加载配置文件
①创建QSettings对象settings,加载数据的类型为ini格式
QSettings settings(config_path_, QSettings::IniFormat);
②读取相机参数
settings.beginGroup("Parameters");//前提得知道组名才行
number_ = settings.value("exposureNum", number_).toInt(); // 默认值 0(当键不存在时)
timer_ = settings.value("exposureTime", timer_).toInt();
settings.endGroup();
③拿到配置文件的信息进行显示
ui.doubleSpinBox_number->setValue(number_);
ui.doubleSpinBox_time->setValue(timer_);

#include "QSettingsStudy.h"

#include <QSettings>
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>

namespace beyondyanyu 
{
    QSettingsStudy::QSettingsStudy(QWidget* parent)
        : QMainWindow(parent)
    {
        ui.setupUi(this);

        connect(ui.pushButton_save, &QPushButton::clicked, this, &QSettingsStudy::on_pushButton_save_clicked);
        connect(ui.pushButton_load, &QPushButton::clicked, this, &QSettingsStudy::on_pushButton_load_clicked);
    }


    void QSettingsStudy::on_pushButton_save_clicked() 
    {
        number_ = ui.doubleSpinBox_number->value();
        timer_ = ui.doubleSpinBox_time->value();

        // 创建 QSettings 对象(指定 INI 格式)
        QSettings settings(config_path_, QSettings::IniFormat);

        // 写入相机内参(整数类型)
        settings.beginGroup("Parameters");
        settings.setValue("exposureNum", number_);    // 曝光次数
        settings.setValue("exposureTime", timer_);    // 曝光时间
        settings.endGroup();

        // 强制同步到磁盘
        settings.sync();


        // 检查写入状态
        if (settings.status() == QSettings::NoError) {
            qDebug() << "succeed:" << config_path_;
            //弹出对话框
            QMessageBox::information(this, "tips", "save succeed");
        }
        else {
            qDebug() << "defeat";
            //弹出对话框
            QMessageBox::warning(this, "error", "save failed");
        }
    }


    void QSettingsStudy::on_pushButton_load_clicked()
    {
        //打开文件夹选择对话框
        QString fileName = QFileDialog::getOpenFileName(this, "Open .ini file", "", "INI Files (*.ini)");

        // 如果选择了文件,则读取配置文件
        if (!fileName.isEmpty()) {
            config_path_ = fileName;

            QSettings settings(config_path_, QSettings::IniFormat);

            // 读取相机内参
            settings.beginGroup("Parameters");
            number_ = settings.value("exposureNum", number_).toInt();    // 默认值 0(当键不存在时)
            timer_ = settings.value("exposureTime", timer_).toInt();
            settings.endGroup();

            // 输出结果
            qDebug() << "相机配置:";
            qDebug() << "曝光次数:" << number_;
            qDebug() << "曝光时间:" << timer_;

            ui.doubleSpinBox_number->setValue(number_);
            ui.doubleSpinBox_time->setValue(timer_);

            return;
        }

        qDebug() << "open error";
        return;
    }

    QSettingsStudy::~QSettingsStudy()
    {}
}

五、效果展示

1,运行初始状态
在这里插入图片描述
2,保存
在这里插入图片描述
在这里插入图片描述

3,修改camera_param.ini配置参数
在这里插入图片描述

4,加载
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

机器学习——集成学习框架(GBDT、XGBoost、LightGBM、CatBoost)、调参方法

一、集成学习框架 对训练样本较少的结构化数据领域&#xff0c;Boosting算法仍然是常用项 XGBoost、CatBoost和LightGBM都是以决策树为基础的集成学习框架 三个学习框架的发展是&#xff1a;XGBoost是在GBDT的基础上优化而来&#xff0c;CatBoost和LightGBM是在XGBoost的基础上…

[蓝桥杯 2023 省 A] 网络稳定性

题目来自DOTCPP&#xff1a; 思路&#xff1a; ①由于题目没有告诉我们成树形结构&#xff0c;可能成环。因此&#xff0c;我们要自己构建树。 ②本体我们通过kruskal重构树&#xff0c;按边权从大到小排序&#xff0c;那么查询的两个点的最近公共祖先权值就是答案。 ③在通…

鸿蒙项目源码-天气预报app-原创!原创!原创!

鸿蒙天气预报项目源码包运行成功含文档ArkTS语言。 我半个月写的原创作品&#xff0c;请尊重原创。 原创作品&#xff0c;盗版必究&#xff01;&#xff01;&#xff01;&#xff01; 原创作品&#xff0c;盗版必究&#xff01;&#xff01;&#xff01;&#xff01; 原创作品…

一文聊聊接入钉钉H5微应用系统实现免登操作技术思路实现验证

一文聊聊接入钉钉H5微应用系统实现免登操作技术思路实现验证 如何创建钉钉应用实现H5端免登录创建钉钉内部应用1.进入钉钉开放平台&#xff0c;配置自己的应用信息2.配置应用相关信息&#xff08;建议选择旧版&#xff0c;后续有一个token获取&#xff0c;新版会提示URL不安全&…

测试开发-定制化测试数据生成(Python+jmeter+Faker)

实现步骤 步骤一&#xff1a;使用pythonfaker随机生成测试数据 在python中开发脚本&#xff0c;随机生成所需要的数据。import json from faker import Faker faker Faker(locale"zh_CN")def generate_faker_user():return {"name" : faker.name(),&qu…

智能体开发平台与大模型关系图谱

架构层级分解(以飞速灵燕智能体平台为例)动态交互流程 3. 关键连接点说明 4. 典型数据流示例

LinuxTCP/UDP基础概念

TCP&#xff08;传输控制协议&#xff09; TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议。它的主要特点包括&#xff1a; 面向连接&#xff1a;在传输数据之前&#xff0c;需要通过“三次握手”建立连接&#xff1b;传输结束后&#xff0c;通过“四次挥手”断开…

【百日精通 JAVA | SQL篇 | 第一篇】初识数据库

一、数据库是什么&#xff1f; 数据库是一类软件&#xff0c;数据库的作用用于管理系统(这是一款成品软件&#xff0c;内部应用了很多数据结构)。 二、数据库分为两大类 1.关系型数据库 对于数据的要求比较严格 通常是以表格的方式来组织数据的。(和Excel差不多) 典型代表…

大数据Spark(五十六):Spark生态模块与运行模式

文章目录 Spark生态模块与运行模式 一、Spark生态模块 二、Spark运行模式 Spark生态模块与运行模式 一、Spark生态模块 Spark 生态模块包括&#xff1a;SparkCore、SparkSQL、SparkStreaming、StructuredStreaming、MLlib 和 GraphX。与 Hadoop 相关的整个技术生态如下所示…

Gossip协议:分布式系统中的“八卦”传播艺术

目录 一、 什么是Gossip协议&#xff1f;二、 Gossip协议的应用 &#x1f4a1;三、 Gossip协议消息传播模式详解 &#x1f4da;四、 Gossip协议的优缺点五、 总结&#xff1a; &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&…

Oracle初识:登录方法、导入dmp文件

目录 一、登录方法 以sys系统管理员的身份登录 &#xff0c;无需账户和密码 以账户密码的用户身份登录 二、导入dmp文件 方法一&#xff1a;PLSQL导入dmp文件 一、登录方法 Oracle的登录方法有两种。 以sys系统管理员的身份登录 &#xff0c;无需账户和密码 sqlplus / a…

微服务架构中的精妙设计:环境和工程搭建

一.前期准备 1.1开发环境安装 Oracle从JDK9开始每半年发布⼀个新版本, 新版本发布后, ⽼版本就不再进⾏维护. 但是会有⼏个⻓期维护的版本. ⽬前⻓期维护的版本有: JDK8, JDK11, JDK17, JDK21 在 JDK版本的选择上&#xff0c;尽量选择⻓期维护的版本. 为什么选择JDK17? S…

【Yolov8部署】 VS2019+opencv-dnn CPU环境下部署目标检测模型

文章目录 前言一、导出yolov8模型为onnx文件二、VS2019配置及opencv环境配置三、opencv部署总结 前言 本文主要研究场景为工业场景下&#xff0c;在工控机与工业相机环境中运行的视觉缺陷检测系统&#xff0c;因此本文主要目的为实现c环境下&#xff0c;将yolov8已训练好的检测…

3.30学习总结 Java包装类+高精度算法+查找算法

包装类&#xff1a; 基本数据类型对应的引用数据类型。 基本数据类型&#xff1a;在内存中记录的是真实的值。 八种包装类的父类都是Object类。 对象之间不能直接进行计算。 JDK5之后可以把int和integer看成一个东西&#xff0c;因为会进行内部优化。自动装箱和自动拆箱。 …

3月30号

// 1.toString 返回对象的字符串表示形式Object objnew Object();String str1obj.toString();System.out.println(str1);//java.lang.Objectb4c966a// 核心逻辑: // 当我们打印一个对象的时候,底层会调用对象的toString方法,把对象变成字符串 // 然…

Java——输入,循环,BigInteger,拷贝,排序

读取输入 打印输出到“ 标准输出流”&#xff08;即控制台窗口&#xff09;是一件非常容易的事情&#xff0c;只要 调用System.out.println 即可。然而&#xff0c;读取“ 标准输人流” System.in就没有那么简单了。要想通 过控制台进行输人&#xff0c;首先需要构造一个Scann…

Elasticsearch客户端工具初探--kibana

1 Kibana简介 Kibana是Elastic Stack&#xff08;ELK&#xff09;中的可视化工具&#xff0c;用于对Elasticsearch中存储的数据进行搜索、分析和可视化展示。它提供了直观的Web界面&#xff0c;支持日志分析、业务监控、数据探索等功能&#xff0c;广泛应用于运维监控、安全分析…

ollama在win10安装、使用、卸载

目录 前置&#xff1a; 1 下载ollama 2 安装 3 配置环境变量&#xff0c;设置模型存储位置 4 使用 5 卸载 前置&#xff1a; 1 在打算安装ollama之前&#xff0c;需要先检查电脑当前状态是否能使用ollama。确认条件满足再进行安装操作。 2 https://github.com/ollama/…

查看iphone手机的使用记录-克魔实战

如何查看 iOS 设备近期的详细使用数据 在日常使用手机时&#xff0c;了解设备的运行状态和各项硬件的使用情况可以帮助分析耗电情况、优化应用使用方式。iOS 设备提供了一些数据记录&#xff0c;能够显示应用的启动和关闭时间、后台运行情况&#xff0c;以及应用在使用过程中调…

[Lc5_dfs+floodfill] 简介 | 图像渲染 | 岛屿数量

目录 0.floodfill算法简介 1.图像渲染 题解 2.岛屿数量 题解 之前我们在 bfs 中有介绍过[Lc15_bfsfloodfill] 图像渲染 | 岛屿数量 | 岛屿的最大面积 | 被围绕的区域&#xff0c;现在我们来看看 dfs 又是如何解决的呢 0.floodfill算法简介 floodfill算法又叫洪水灌溉或者…