前言:在客户端程序中都会大量采用配置文件例如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();
}
以上就是全部内容,如果有错误,或者不理解的地方欢迎大家在评论区指出