Qt中ini文件读写,以及如何将ui控件中的数据读写到ini文件

前言:在客户端程序中都会大量采用配置文件例如ini文件来进行软件的相关配置。

采用配置文件的优势
1、增加软件的灵活性和可维护性,将配置信息存储在配置文件中可以使程序更易于配置和维护。如果需要修改配置,只需修改配置文件而不必修改源代码。
2、安全性: 一些敏感的信息(比如数据库密码、API密钥等)不应该硬编码在程序中,而是应该存储在配置文件中,并受到适当的访问控制。
3、部署管理: 在不同环境中(例如开发、测试、生产环境)使用不同的配置文件,可以简化部署管理,并且降低因配置差异导致的错误风险。

言归正传,接下来我就来教大家如何在qt中使用ini配置文件。

首先给大家介绍下ini文件格式

ini配置文件由节、键、值组成。

【参数】(键=值):

INI所包含的最基本的“元素”就是参数(parameter),每个参数都有一个name和一个value,name和value由等号“=”隔开,name在等号的左边。如:

name=value

【节】:

所有的参数都是以节(section)为单位结合在一起的。所有的section名称都是独占一行,并且section名字都被方括号包围着([和])。在section声明后的所有parameters都属于该section。一个section没有明显的结束标识符,一个section的开始就是上一个section的结束,或者是文件结束。如:

[section]

【注解】:

注解(comments)使用分号表示(;),在分号后面的文字,直到该行结尾都全部为注释。

;comment textINI文件的数据格式的例子(配置文件的内容)

【ini文件示例】:

;ini文件示例
[test1]
lineEdit_1=1
lineEdit_2=2

[test2]
lineEdit_3=3
lineEdit_4=4

[test3]
lineEdit_5=5
lineEdit_6=6

这里test1,test2,test3是ini文件的节,lineEdit_1=1中,lineEdit_1和1分别是参数中的键和值。

对ini文件有初步了解后,我们开始读写ini文件。上代码(代码中使用的是以上ini文件,ini文件名为test.ini)

首先写了一个ini读写的工具类,方便后期使用采用单例模式

iniTool.h

#ifndef INIREAD_UTIL_H
#define INIREAD_UTIL_H

#include <QMap>

class iniRead_Util
{
public:
    iniRead_Util();

    static iniRead_Util& ini_util() {
        static iniRead_Util ini_util; //单例实例
        return ini_util;
    }
    // 禁止拷贝和赋值
    iniRead_Util(const iniRead_Util &) = delete;
    iniRead_Util &operator=(const iniRead_Util &) = delete;

    //对外提供访问接口
    QMap<QString, int> getMainIniMap() const;
    void setMyMap(const QMap<QString, QString> &map);

    void readIni();//读ini文件
    void writeIni();//写ini文件


private:
    QMap<QString, int> m_MapIniMainArg;//存储对应ini文件内容,由于ini文件是键值对的形式,所以这里我采用map集合来存储
    QList<QString> m_ListIniMainKey;//存储ini文件中所有的键名
};

#endif // INIREAD_UTIL_H

iniTool.cpp

#include "iniread_util.h"
#include <QSettings>


iniRead_Util::iniRead_Util()
{

}

QMap<QString, int> iniRead_Util::getMainIniMap() const {
    return m_MapIniMainArg;
}

void iniRead_Util::setMyMap(const QMap<QString, QString> &map) {
    m_MapIniMainArg= map;
}

void iniRead_Util::readIni()
{
    static QSettings ini_main("test.ini", QSettings::IniFormat);
    for (QString key: ini_main.allKeys())
    {
        m_ListIniMainKey.append(key);//将ini文件key保存起来,方便读写
        QString ini_mainKey = key.section('/', 1);//这里是字符串截取,因为读出来的ini文件中会带有节名,我们只需要后面的部分。这里方便将数据set到ui控件中,要将ini中键名和控件名保持一致
        m_MapIniMainArg.insert(ini_mainKey, ini_main.value(key).toInt());
    }
}

void iniRead_Util::writeIni()
{
	//这里采用双层for循环,外层遍历存储ini文件键值对的map集合,内层遍历存储ini文件键名的list集合
	//因为map集合中存储的键名是不带ini文件节名的为了方便使用,所以这里需要判断一下,然后一一对应就将数据写入
    for (QString key : m_MapIniMainArg.keys())
    {
        for (const QString& data : m_ListIniMainKey) {
            QString simplifiedKey = data.section('/', 1);
            if(key == simplifiedKey)
            {
                static QSettings ini_main("test.ini", QSettings::IniFormat);
                ini_main.setValue(data,m_MapIniMainArg.value(key));
            }
        }
    }
}

ini读写工具类就给大家介绍完了,开始介绍如何使用
在qt中创建一个窗口mainwindow
添加控件lineEdit,名字分别为lineEdit_1~lineEdit_6
添加两个按钮pushButton_1,pushButton_2

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "qlineedit.h"
#include <QMap>
#include <QMainWindow>

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_pushButton_1_clicked();//读按钮
    void on_pushButton_2_clicked();//写按钮

private:
    Ui::MainWindow *ui;
	QList<QLineEdit*> m_ListlineEdits;//ui中所有lineEdits控件
    QMap<QString, QString> m_MaplineEditNames;//ui中所有lineEdits控件的名字以及存储的信息
    QMap<QString, int> m_MapuiText;//接收ini读取文件
};
#endif // MAINWINDOW_H


#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QTranslator>
#include <ini_tool.h>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

//读ini
void MainWindow::on_pushButton_1_clicked()
{
    iniRead_Util::ini_util().readIni();
    // 获取所有的QLineEdit子对象
    m_ListlineEdits = this->findChildren<QLineEdit*>();

    m_MapuiText = iniRead_Util::ini_util().getMainIniMap();
    // 遍历并打印每个QLineEdit的对象名称
    foreach (QLineEdit* lineEdit, m_ListlineEdits) {
        for (QString key : m_MapuiText.keys())
        {
            //QString simplifiedKey = key.section('/', 1); // 获取第二个分隔符后的部分
            if(lineEdit->objectName() == key)
            {
                lineEdit->setText(QString::number(m_MapuiText.value(key)));
            }
        }
    }
}

//写ini
void MainWindow::on_pushButton_2_clicked()
{
    // 将控件中的信息储存到键值对
    foreach (QLineEdit* lineEdit, m_ListlineEdits) {
        QString name = lineEdit->objectName();
        QString text = lineEdit->text();
        m_MaplineEditNames.insert(name, text);
    }
    iniRead_Util::ini_util().setMyMap(m_MaplineEditNames);
    iniRead_Util::ini_util().writeIni();
}


以上就是全部内容,如果有错误,或者不理解的地方欢迎大家在评论区指出

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值