很多情况,在做项目开发的时候,将参数独立出来是比较好的方法
例如:相机的曝光次数、曝光时长等参数,独立成ini文件,用户可以在外面修改即可生效,无需在动代码重新编译等工作
QSettings便可以实现该功能
内容:用户在UI界面输入相机的曝光时间、次数,点击保存,生成camera.ini配置文件,下次点击加载时自动加载并使用
一、新建项目
项目结构如下:
页面布局如下:
稍微美化一下:
这个Qt生成的UI类名称在这里可以修改
二、QSettingsStudy.h
1,出于习惯,我将类放在了beyondyanyu命名空间下
2,相机配置文件包含曝光次数number_
和曝光时间timer_
3,配置文件存放的路径为config_path_
4,两个button(保存
和加载
)对应两个槽函数(on_pushButton_save_clicked
和on_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,加载