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

cpp 复制代码
#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;

cpp 复制代码
#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_);

cpp 复制代码
#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,加载

相关推荐
二进制人工智能7 小时前
【QT5 网络编程示例】TCP 通信
网络·c++·qt·tcp/ip
bjxiaxueliang9 小时前
一文详解QT环境搭建:Windows使用CLion配置QT开发环境
开发语言·windows·qt
此刻我在家里喂猪呢10 小时前
qt介绍tcp通信
qt·tcp/ip
oracleworm11 小时前
Qt 代理
qt·代理模式
Winner130011 小时前
Qt中数据共享
开发语言·qt
学习是种信仰啊12 小时前
QT图片轮播器实现方法二(QT实操2)
开发语言·c++·qt
疾风铸境12 小时前
Qt5.14.2+Cmake使用mingw64位编译opencv4.5成功图文教程
开发语言·qt
fengbingchun14 小时前
Qt中的事件循环
qt
秋风&萧瑟16 小时前
【QT】练习1
开发语言·qt·命令模式
byxdaz17 小时前
Qt中绘制不规则控件
开发语言·qt