Qt配置文件之INI

238 阅读4分钟

​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();

}