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,加载

相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能16 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G16 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt