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

很多情况,在做项目开发的时候,将参数独立出来是比较好的方法
例如:相机的曝光次数、曝光时长等参数,独立成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_OBJECTpublic: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.mzph.cn/news/899885.shtml

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

相关文章

运维培训班之最佳选择(The best Choice for Operation and Maintenance Training Courses)

运维培训班之最佳选择 从面试官的角度聊聊培训班对运维的帮助&#xff0c;同时给培训班出身的运维一些建议~ 谈到运维&#xff08;尤其是零基础非科班转行的运维&#xff09;找工作&#xff0c;培训班是个不可回避的讨论热点。虽然本人也做过兼职运维培训老师&#xff0c;多少…

网络安全与防护策略

随着信息技术的飞速发展&#xff0c;互联网已成为现代社会不可或缺的一部分。从日常生活到企业运营&#xff0c;几乎所有活动都离不开网络。然而&#xff0c;网络的开放性和广泛性也使得网络安全问题愈发严峻。无论是个人数据泄露&#xff0c;还是大规模的网络攻击&#xff0c;…

LLM 分词器Tokenizer 如何从 0 到 1 训练出来

写在前面 大型语言模型(LLM)处理的是人类的自然语言,但计算机本质上只能理解数字。Tokenizer(分词器) 就是架在自然语言和计算机数字表示之间的一座至关重要的桥梁。它负责将我们输入的文本字符串分解成模型能够理解的最小单元——Token,并将这些 Token 转换成对应的数字…

【ArcGIS微课1000例】0142:如何从谷歌地球保存高清影像图片

文章目录 一、选取影像区域1. 搜索地图区域2. 导入矢量范围二、添加输出图层三、保存高清影像1. 地图选项2. 输出分辨率3. 保存图像四、注意事项一、选取影像区域 首先需要选取影像区域,可通过以下方式快速定位。 1. 搜索地图区域 在搜索框内输入关键词,例如青海湖,点击【…

Unity注册表修改分辨率:探索幕后设置与手动调控

Unity注册表修改分辨率&#xff1a;探索幕后设置与手动调控 在Unity开发中&#xff0c;调整分辨率和显示模式是开发过程中常见的需求&#xff0c;尤其是当我们打包并运行应用时&#xff0c;可能会遇到显示模式不符合预期的情况。Unity在首次运行时会自动保存这些设置&#xff…

外部流输入的 Layer

在 Android 的 SurfaceFlinger 体系中&#xff0c;外部流输入的 Layer 通常通过 Sideband Stream 或 BufferQueue 机制传递给 SurfaceFlinger&#xff0c;然后由 HWC&#xff08;Hardware Composer&#xff09;或 OpenGL ES 进行合成。 1. 什么是外部流输入的 Layer&#xff1f…

31-体测管理系统

介绍 技术&#xff1a; 基于 B/S 架构 SpringBootMySQLvueelementui 环境&#xff1a; Idea mysql maven jdk1.8 node 用户端功能 1.系统首页展示轮播图及公告信息 2.测试项目:展示可以参加测试的项目列表 3.公告信息:公告信息列表及详情 可进行点赞和收藏 4.在线留言 5.个人…

NVR接入录像回放平台EasyCVR视频系统守护舌尖上的安全,打造“明厨亮灶”云监管平台

一、方案背景 近年来&#xff0c;餐饮行业食品安全和卫生等问题频发&#xff0c;比如后厨卫生脏乱差等&#xff0c;持续引发关注&#xff0c;这些事情导致连锁反应&#xff0c;使其收益遭受损失。同时&#xff0c;给消费者造成了心理和生理上的伤害。 加强餐饮行业的监管成为…

Python办公自动化(3)对Excel的操作

1.读取excel文件 1.安装工具 终端下载读取excel文档的工具库&#xff1a; pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd 若对版本有特殊需求&#xff1a; 删除当前版本&#xff1a;pip3 uninstall xlrd 下载所需要的版本&#xff1a;pip3 install -i htt…

go语言:开发一个最简单的用户登录界面

1.用deepseek生成前端页面&#xff1a; 1.提问&#xff1a;请你用html帮我设计一个用户登录页面&#xff0c;要求特效采用科技感的背景渲染加粒子流动&#xff0c;用css、div、span标签&#xff0c;并给出最终合并后的代码。 生成的完整代码如下&#xff1a; <!DOCTYPE h…

blender二次元上色

前&#xff1a; 后&#xff1a;&#xff08;脸自己会发光) 参考&#xff1a;05-模型导入与材质整理_哔哩哔哩_bilibili

Mysql+Demo 获取当前日期时间的方式

记录一下使用Mysql获取当前日期时间的方式 获取当前完整的日期时间有常见的四种方式&#xff0c;获取得到的默认格式(mysql的格式标准)是 %Y-%m-%d %H:%i:%s其它格式 %Y-%m-%d %H:%i:%s.%f方式一&#xff1a;now()函数 select now();mysql> select now(); -------------…

C#核心学习(六)面向对象--封装(5)静态成员及静态构造函数和静态类 以及和常量的区别

目录 一、什么是静态的&#xff1f;什么是常量&#xff1f; 1. ​静态&#xff08;Static&#xff09;​ 2. ​常量&#xff08;const&#xff09;​ 二、类中的静态成员有什么用&#xff1f; 1. ​共享数据 2. ​工具方法与全局配置 3. ​单例模式 三、静态类和静态成…

FreeRTOS源码下载分享

FreeRTOS源码下载分享 官网下载太慢了&#xff0c;分享下FreeRTOSv202411 FreeRTOSv202411.00.zip 链接: https://pan.baidu.com/s/1P4sVS5WroYEl0WTlPD7GXg 提取码: g6aq

2025年win10使用dockerdesktop安装k8s

一、写作背景 百度了一圈&#xff0c; 要么教程老&#xff0c;很多操作步骤冗余&#xff0c; 要么跑不通&#xff0c;或者提供的链接失效等情况。 二、看前须知 1、安装过程使用的AI辅助&#xff0c; 因为参考的部分博客卡柱了。 2、如果操作过程中遇到卡顿&#xff0c; …

一段式端到端自动驾驶:UniAD:Planning-oriented Autonomous Driving

论文地址:https://arxiv.org/pdf/2212.10156 代码地址:https://github.com/OpenDriveLab/UniAD 1. 摘要 现代自动驾驶系统通常由一系列按顺序执行的模块任务构成,例如感知、预测和规划。为了完成多种任务并实现高级别的智能化,当前的方法要么为每个任务部署独立模型,要…

【企业文化】CXO是什么?

李升伟 整理 CXO 是企业中高层管理职位的统称&#xff0c;其中的 “X” 是一个变量&#xff0c;代表不同的职能领域。CXO 通常指企业最高管理层中的各个负责人&#xff0c;他们共同参与企业的战略决策和运营管理。以下是一些常见的 CXO 职位及其职责&#xff1a; 1. CEO&…

python中的 f 是什么意思,f‘{username}_log_archive_{int(time.time())}.txt‘

python中的 f 是什么意思,f’{username}log_archive{int(time.time())}.txt’ 在 Python 中,f 是一种字符串前缀,用于创建格式化字符串(也称为 f-string),它是 Python 3.6 及更高版本引入的一种方便的字符串格式化方式。 基本语法和功能 当你在字符串前加上 f 前缀时,…

论文浅尝 | Interactive-KBQA:基于大语言模型的多轮交互KBQA(ACL2024)

转载至&#xff1a;何骏昊 开放知识图谱 原文地址&#xff1a;论文浅尝 | Interactive-KBQA&#xff1a;基于大语言模型的多轮交互KBQA&#xff08;ACL2024&#xff09; 笔记整理&#xff1a;何骏昊&#xff0c;东南大学硕士&#xff0c;研究方向为语义解析 论文链接&#xff…

MySQL注入中user-agent和cookie存在的注入

uagent注入 1、漏洞成因&#xff1a; 当Web应用程序将用户提供的User-Agent值未经处理直接拼接到SQL查询语句时&#xff0c;攻击者可以通过构造恶意User-Agent值闭合原有SQL语句并注入任意SQL代码。 2、以less-18为例&#xff1a; 相比前几关&#xff0c;第18关对于uname和pa…