Qt保存信息到INI文件,并在重新打开程序时读取
(以存取简单三轴信息为例)
在Assistance中搜索INI得知需要使用Qsettings类,如下图:
在Qt中操作INI文件
- 效果:界面如图1。comboBox里为三轴字符串、spinBox与horizontalSlider的值互相绑定且与comboBox中字符串有关、lineEdit显示的字符串也与comboBox有关,修改lineEdit后按回车存入。
图1.界面
存取的INI文件内容如图2。三轴字符串为组名,与之相关的长度和文本信息为其中的key。General组中的isDefault用来判断INI文件是否存在。
图2 INI文件内容
-
代码:为了更好的解耦,把INI文件的修改(QSettings)单独封装成一个类configureinitfile。
mainwindow.h中 除了几个槽函数就是增加了个配置类ConfigureInitFile的指针。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "INI/configureinitfile.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_Length_horizontalSlider_valueChanged(int value);
void on_Length_spinBox_valueChanged(int arg1);
void on_Defaults_pushButton_clicked();
void on_Axis_comboBox_currentTextChanged(const QString &arg1);
void on_lineEdit_returnPressed();
private:
Ui::MainWindow *ui;
ConfigureInitFile *iniFile;
};
#endif // MAINWINDOW_H
mainwindow.c 中对ConfigureInitFile实例化并实现几个槽函数。
#include "mainwindow.h"
#include "ui_mainwindow.h"
//#include <QDebug>
//#include <QSettings>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
iniFile = new ConfigureInitFile();
ui->Axis_comboBox->addItems({"X_Axis","Y_Axis","Z_Axis"});
}
MainWindow::~MainWindow()
{
delete iniFile;
delete ui;
}
void MainWindow::on_Length_horizontalSlider_valueChanged(int value) //horizontalSlider值变动事件
{
ui->Length_spinBox->setValue(value); //设置 spinBox值
QString axis;
axis = ui->Axis_comboBox->currentText(); //当前comboBox 值
iniFile->_setINIValue(axis,value); //存到对应组的key中
}
void MainWindow::on_Length_spinBox_valueChanged(int arg1)
{
ui->Length_horizontalSlider->setValue(arg1);
QString axis;
axis = ui->Axis_comboBox->currentText();
iniFile->_setINIValue(axis,arg1);
}
void MainWindow::on_Defaults_pushButton_clicked() //default按钮点击事件
{
QMessageBox::StandardButton result;
result=QMessageBox::information(NULL,"Default","Axis value will be set to default",QMessageBox::Yes|QMessageBox::No);
if(result == QMessageBox::Yes) //确认是否重置
{
iniFile->_userSetDefault(); //将INI文件内容重置
QString axis;
int value;
QString string;
axis = ui->Axis_comboBox->currentText(); //更新当前 数据
iniFile->_getINIValue(axis,&value);
iniFile->_getINIValue(axis,&string);
ui->Length_spinBox->setValue(value);
ui->lineEdit->setText(string);
}
}
void MainWindow::on_Axis_comboBox_currentTextChanged(const QString &arg1) //comboBox文本改变事件
{
int value;
QString string;
iniFile->_getINIValue(arg1,&value); // 读取当前文本对应数据并更新到其他控件中
iniFile->_getINIValue(arg1,&string);
ui->Length_spinBox->setValue(value);
ui->lineEdit->setText(string);
}
void MainWindow::on_lineEdit_returnPressed() //lineEdit回车事件
{
QString axis;
axis = ui->Axis_comboBox->currentText(); //更新到当前组的key中
iniFile->_setINIValue(axis,ui->lineEdit->text());
}
configureinitfile.h 文件实现对INI文件的操作:
#ifndef CONFIGUREINITFILE_H
#define CONFIGUREINITFILE_H
#include <QSettings>
//#include <QDir> //想要存到其他文件夹 可能需要使用到 文件夹操作类
#include <QStringList>
#define AXISNUM 3 //comboBox的文本信息个数(组名数)
struct IniData{ //暂存结构体
QString axisName;
int axisLength;
QString axisText;
};
class ConfigureInitFile : public QObject
{
Q_OBJECT
private:
QSettings *iniFile;
QStringList axisName = {"X_Axis","Y_Axis","Z_Axis"}; //comboBox的文本信息(组名)
IniData iniData[AXISNUM]; //暂存结构体数组
void _loadFile(); //程序打开时 判断INI文件是否存在并读取到结构体数组中
void _saveFile(); //程序关闭时 将结构体数组中数据存到INI文件
void _setINIDefault(); //将INI文件set成默认值
public:
ConfigureInitFile();
~ConfigureInitFile();
void _userSetDefault(); // 设置默认函数 外部接口
void _getINIValue(QString name,int *length); //根据组名 存或取值
void _getINIValue(QString name,QString *text);
void _setINIValue(QString name,int length);
void _setINIValue(QString name,QString text);
};
#endif // CONFIGUREINITFILE_H
configureinitfile.c
#include "configureinitfile.h"
//#include <QDebug>
#include <mainwindow.h>
ConfigureInitFile::ConfigureInitFile()
{
iniFile = new QSettings("INIFILE.ini",QSettings::IniFormat); //创建INI文件连接 ,若不存在文件会在写入值时创建
_loadFile(); //读取INI文件值
}
ConfigureInitFile::~ConfigureInitFile()
{
_saveFile(); //关闭时保存INI
delete iniFile;
}
void ConfigureInitFile::_userSetDefault() //set default后 重新加载结构体数据数据
{
_setINIDefault();
_loadFile();
}
void ConfigureInitFile::_getINIValue(QString name, int *length)
{
for (int var = 0; var < axisName.size(); var++)
{
if(name == iniData[var].axisName)
{
*length = iniData[var].axisLength;
}
}
}
void ConfigureInitFile::_getINIValue(QString name, QString *text)
{
for (int var = 0; var < axisName.size(); var++)
{
if(name == iniData[var].axisName)
{
*text = iniData[var].axisText;
}
}
}
void ConfigureInitFile::_setINIValue(QString name, int length)
{
for (int var = 0; var < axisName.size(); var++)
{
if(name == iniData[var].axisName)
{
iniData[var].axisLength = length;
}
}
}
void ConfigureInitFile::_setINIValue(QString name, QString text)
{
for (int var = 0; var < axisName.size(); var++)
{
if(name == iniData[var].axisName)
{
iniData[var].axisText = text;
}
}
}
void ConfigureInitFile::_loadFile() //读取INI文件值
{
if(!iniFile->contains("isDefault")) //File don't exist 不存在对应的key证明文件不存在
{
ConfigureInitFile::_setINIDefault(); //写入默认值
}
for (int var = 0; var < axisName.size(); var++) //读到结构体数组中
{
iniData[var].axisName = axisName.at(var);
iniData[var].axisLength = iniFile->value(axisName.at(var)+"/Length",20).toInt();
iniData[var].axisText = iniFile->value(axisName.at(var)+"/Text","Its "+axisName.at(var)).toString();
}
}
void ConfigureInitFile::_saveFile() //保存结构体数据到INI
{
iniFile->setValue("isDefault","false"); //用于判断是否第一次生成的
foreach (QString axis, axisName) { //对QstringList中的组名和结构体里的组名遍历 确保存入正确的组里
iniFile->beginGroup(axis); //组名
for (int var = 0; var < axisName.size(); var++)
{
if(axis == iniData[var].axisName)
{
iniFile->setValue("Length",iniData[var].axisLength); //set key value
iniFile->setValue("Text",iniData[var].axisText);
}
}
iniFile->endGroup();
}
}
void ConfigureInitFile::_setINIDefault() //INI默认值 按User需求修改
{
iniFile->setValue("isDefault","ture");
iniFile->beginGroup("X_Axis");
iniFile->setValue("Length","30");
iniFile->setValue("Text","Its X");
iniFile->endGroup();
iniFile->beginGroup("Y_Axis");
iniFile->setValue("Length","26");
iniFile->setValue("Text","Its Y");
iniFile->endGroup();
iniFile->beginGroup("Z_Axis");
iniFile->setValue("Length","22");
iniFile->setValue("Text","Its Z");
iniFile->endGroup();
}