很多情況,在做項目開發的時候,將參數獨立出來是比較好的方法
例如:相機的曝光次數、曝光時長等參數,獨立成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_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,加載