一、INI文件概述
.ini文件时Initialization File的缩写,即初始化文件,是Windows的系统配置文件所采用的存储格式。文件扩展名:配置名称.ini 。比如项目中的配置文件是整个项目共用的,假设数据路配置.ini
1.INI 文件由节、键、值由三部分组成:#include<QSettings>
节[section]
(键=值)name=value;
例如:
[sectionname]
Keynames=values
常用的API
QSettings 是 Qt 框架中用于读取和写入应用程序设置的类。它提供了一种简单的方式来保存和检索应用程序的配置信息,如窗口位置、用户首选项、历史记录等。
QSettings 类的一些常用方法和属性:
构造函数:
QSettings():使用默认的构造函数创建一个 QSettings 对象,读取系统的全局设置。
QSettings(const QString& organization, const QString& application):根据组织和应用程序名称
创建一个 QSettings 对象,读取应用程序的设置。
设置值:
setValue(const QString& key, const QVariant& value):设置指定键的值。
beginGroup(const QString& prefix):开始一个组,可以在值名称前加上组名称以进行分组。
endGroup():结束当前组。
获取值:
value(const QString& key, const QVariant& defaultValue = QVariant()):获取指定键的值,如果键不存在,则返回默认值。
contains(const QString& key):检查指定键是否存在。
childKeys():获取当前组下所有键的列表。
childGroups():获取当前组下所有子组的列表。
删除值:
remove(const QString& key):从设置中删除指定键及其对应的值。
remove(const QString& key):删除当前组及其下的所有键和值。
设置文件路径:
setPath(QSettings::Format format, QSettings::Scope scope, const QString& path):设置设置文件的格式、范围和路径。默认情况下,设置文件存储在操作系统的特定位置。
静态函数:
QSettings::defaultFormat():获取默认设置文件格式。
QSettings::setDefaultFormat(QSettings::Format format):设置默认设置文件格式。
注意:QSettings 会根据不同平台(Windows、Linux、macOS 等)以及应用程序的组织和名称自动选择存储路径。
代码demo
#include "wrinifile.h"
#include <QSettings>
#include <QtDebug>
void WriteIniFiles() // 写配置文件
{
// 直接使用QSettings类读写INI文件 第二个参数是设置文件的格式。这里指定为 QSettings::IniFormat,表示使用 INI 格式。
QSettings *ConfigWriteIniFiles=new QSettings("Files.ini",QSettings::IniFormat);
// 向INI文件当中写入数据信息
// 第一节的第一参数,后面就依次类推
ConfigWriteIniFiles->setValue("/database/ip","192.168.12.1");
ConfigWriteIniFiles->setValue("/database/port","3306");
ConfigWriteIniFiles->setValue("/database/user","root");
ConfigWriteIniFiles->setValue("database/password","123456");
//第二节
ConfigWriteIniFiles->setValue("/notice/version","5.6");
ConfigWriteIniFiles->setValue("/notice/datetime","2022-10-25 16:27:23");
// 向IN文件写入完成之后,删除指针
delete ConfigWriteIniFiles;
}
void ReadIniFiles() // 读配置文件
{
QSettings *ConfigReadIniFiles=new QSettings("MySQLFiles.ini",QSettings::IniFormat);
QString strip=ConfigReadIniFiles->value("/database/ip").toString();
QString strport=ConfigReadIniFiles->value("/database/port/").toString();
QString struser=ConfigReadIniFiles->value("/database/user").toString();
QString strpassword=ConfigReadIniFiles->value("/database/password").toString();
QString strversion=ConfigReadIniFiles->value("/notice/version").toString();
QString strdatetime=ConfigReadIniFiles->value("/notice/datetime").toString();
// 输出读取配置文件的参数信息
qDebug()<<"读取INI配置文件参数选项如下:";
qDebug()<<"IP地址:"<<strip.toUtf8().data();
qDebug()<<"端口:"<<strport.toUtf8().data();
qDebug()<<"用户:"<<struser.toUtf8().data();
qDebug()<<"密码:"<<strpassword.toUtf8().data();
qDebug()<<"版本:"<<strversion.toUtf8().data();
qDebug()<<"日期:"<<strdatetime.toUtf8().data();
// 将读取配置文件完成之后,删除指针
delete ConfigReadIniFiles;
}
void ReadIniFilesIsKey()
{
QSettings setting("./MySQLFiles.ini",QSettings::IniFormat);
foreach(QString key,setting.allKeys())
{
qDebug()<<key.toUtf8().data()<<":"<<setting.value(key).toString().toUtf8().data();
}
}
二、JSON 文件格式
JSON使用场景:配置文件、序列化、定义接口等等
JSON是存储和交换文本信息的语法类似XML,它比XML更小、更快、更加容易解析
#include <QFile> // 文件读写\\\\\\#include <QJsonDocument> // JSON文档\\\\\#include <QJsonObject> // JSON对象\\\\\\#include <QJsonParseError> // JSON异常捕捉
写入流程:创建JSON对象、 创建JSON文档(加载json对象)、创建文件写入
读出流程:创建QJsonDocument 加载字符串,然后将它转化为QJsonObject对象
#include "qjsonoper.h"
#include "ui_qjsonoper.h"
#include <QMessageBox>
#include <QDebug>
#include <QFile> // 文件读写
#include <QJsonDocument> // JSON文档
#include <QJsonObject> // JSON对象
#include <QJsonParseError> // JSON异常捕捉
QJsonOper::QJsonOper(QWidget *parent)
: QDialog(parent)
, ui(new Ui::QJsonOper)
{
ui->setupUi(this);
}
QJsonOper::~QJsonOper()
{
delete ui;
}
// 将数据信息-->写入JSON文件
void QJsonOper::on_pushButtonWriteJson_clicked()
{
// 1:创建json对象
QJsonObject mysqinfo;
mysqinfo.insert("ip","192.168.0.125");
mysqinfo.insert("port",3308);
mysqinfo.insert("user","root");
mysqinfo.insert("password","123456");
QJsonObject jsonifo;
jsonifo.insert("code",1);
jsonifo.insert("dbmsg","MySQL数据库配置参数");
jsonifo.insert("data",mysqinfo); // 将json对象作为Json对象插入的数据值
// 2: 创建JSON文档
QJsonDocument jsondoc;
jsondoc.setObject(jsonifo);
// 3: 创建文件
QFile qfiles("./databasejsonfiles.json");
if(qfiles.open(QIODevice::WriteOnly))
{
qfiles.write(jsondoc.toJson());
qfiles.close();
qDebug()<<"恭喜你,json数据文件写入成功!";
}
QMessageBox::information(this,"写入成功","恭喜你,json数据文件写入成功!");
}
void QJsonOper::on_pushButtonReadJson_clicked()
{
QString strjson;
QString strmsg;
QFile qfiles("./databasejsonfiles.json");
if(qfiles.open(QIODevice::ReadOnly))
{
strjson=qfiles.readAll();
qfiles.close();
}
QJsonParseError jsonerror; // 返回JSON解析错误的时候,报告错误信息
QJsonDocument jsondoc=QJsonDocument::fromJson(strjson.toUtf8(),&jsonerror);
QString strtemp;
if(!jsondoc.isEmpty() && (jsonerror.error==QJsonParseError::NoError))
{
// 只要jsondoc不为空,和jsonerror没有错误
// 将它转换为JSON对象
QJsonObject json=jsondoc.object();
QJsonValue code=json.value("code");
QJsonValue data=json.value("data");
// 检查数据
if(code.isUndefined() || code.toDouble()!=1 || data.isUndefined() || !data.isObject())
{
qDebug()<<"转换JSON数据错误,请重新检查?";
QMessageBox::critical(this,"错误","转换JSON数据错误,请重新检查?");
exit(100);
}
// 如果没有错误,读取data数据信息
QJsonObject databaseinfo=data.toObject();
QJsonValue dbip=databaseinfo.value("ip");
QJsonValue dbport=databaseinfo.value("port");
QJsonValue dbuser=databaseinfo.value("user");
QJsonValue dbpassword=databaseinfo.value("password");
// 检查接口是否正确
if(dbip.isUndefined()||
dbport.isUndefined()||
dbuser.isUndefined()||
dbpassword.isUndefined())
{
qDebug()<<"接口错误,请重新检查?";
QMessageBox::critical(this,"错误","接口错误,请重新检查?");
exit(100);
}
QString strip=dbip.toString();
int iport=dbport.toInt();
QString struser=dbuser.toString();
QString strpassword=dbpassword.toString();
// 判断每一项配置是否为空
if(strip.isEmpty() || struser.isEmpty() || strpassword.isEmpty())
{
qDebug()<<"此数据项不能为空,请重新检查?";
QMessageBox::critical(this,"错误","此数据项不能为空,请重新检查?");
exit(100);
}
qDebug()<<"数据库IP地址:"<<strip;
qDebug()<<"数据库端口:"<<iport;
qDebug()<<"数据库用户:"<<struser;
qDebug()<<"数据库密码:"<<strpassword;
// 拼接字符串
strmsg+="【JSON配置参数】";
strmsg+="\n数据库IP地址:"+strip;
strmsg+="\n数据库端口:"+QString::number(iport,10);
strmsg+="\n数据库用户:"+struser;
strmsg+="\n数据库密码:"+strpassword;
}
QMessageBox::information(this,"成功",strmsg,QMessageBox::Yes);
}
三、XML 语言
可扩展标记语言(Extensible Markup Language,XML),标准通用语言子集,可以用来标记数据、定义数据、是一种允许用户对自己的标记语言进行定义的源语言。
#include <QDomComment>// QDomComment是Qt所封装的类,专门用来操作XML文件(项目中用来存储一些配置数据信息)
.h
#ifndef READWRITEXML_H
#define READWRITEXML_H
#include <QDialog>
#include <QDir>
#include <QFile> //写入文件
#include <QXmlStreamReader> //读xml
#include <QXmlStreamWriter> //写xml
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class ReadWriteXml; }
QT_END_NAMESPACE
class ReadWriteXml : public QDialog
{
Q_OBJECT
public:
ReadWriteXml(QWidget *parent = nullptr);
~ReadWriteXml();
private:
Ui::ReadWriteXml *ui;
QFile m_qfile;
QString strcurrentfilepath; //当前文件路径
QString strcurrentfilename; //当前文件名
public:
bool openXMLFile(const QString&); //打开指定文件
void readXMLFile(QFile&,const QString&); //读取指定文件
void writeXMLFile(QFile&,const QString&); //写入xml文件
private slots:
void on_pushButton_write_clicked();
void on_pushButton_read_clicked();
};
#endif // READWRITEXML_H
.cpp
#include "readwritexml.h"
#include "ui_readwritexml.h"
ReadWriteXml::ReadWriteXml(QWidget *parent)
: QDialog(parent)
, ui(new Ui::ReadWriteXml)
{
ui->setupUi(this);
QDir dir;
strcurrentfilepath = "e:/xmlfiles"; //xml路径
strcurrentfilename = "/factoryworker.xml";//文件名
}
ReadWriteXml::~ReadWriteXml()
{
delete ui;
}
bool ReadWriteXml::openXMLFile(const QString &filename)
{
//如果没有则创建文件
m_qfile.setFileName(strcurrentfilepath + filename);
return m_qfile.open(QIODevice::ReadWrite|QIODevice::Text);
}
void ReadWriteXml::readXMLFile(QFile& file,const QString &fileName)
{
if(!openXMLFile(fileName))
{
qDebug()<<"打开xml文件读取失败,请重新检查";
return;
}
qDebug()<<"打开xml文件读取成功";
QXmlStreamReader xmlread(&file);
// 逐行读取 XML 文件内容
/*
* xmlread.atEnd():如果读取器读取到XML文档的末尾,或者发生错误()并中止读取,则返回true。否则,返回false。
* xmlread.hasError():检查是否存在错误;如果发生错误返回true,否则返回false。
* readNext():读取下一个XML令牌,返回QXmlStreamReader::TokenType以指示令牌的类型。
*/
// QString parentElement;
while (!xmlread.atEnd() && !xmlread.hasError()) {
// 读取下一个XML令牌
QXmlStreamReader::TokenType token = xmlread.readNext();
qDebug()<<token;
// 在此处处理 XML 内容,例如读取元素、属性和文本
if(token == QXmlStreamReader::StartElement)// 开始元素标签
{
/*
* name()返回StartElement、EndElement或EntityReference的本地名称。
* readElementText()读取到对应的EndElement并返回中间的所有文本。
*/
QString elementName = xmlread.name().toString();
// 设置父节点
// parentElement = elementName;
//QString text = xmlread.readElementText(); // 读取元素的文本内容
qDebug()<<elementName;
if(elementName =="WNo")
{
ui->lineEdit_7->setText(xmlread.readElementText());
}
else if(elementName == "WName")
{
ui->lineEdit_8->setText(xmlread.readElementText());
}
else if(elementName == "WSex")
{
ui->lineEdit_9->setText(xmlread.readElementText());
}
else if(elementName == "WEducation")
{
ui->lineEdit_10->setText(xmlread.readElementText());
}
else if(elementName == "WDepartment")
{
ui->lineEdit_11->setText(xmlread.readElementText());
}
else if(elementName == "WSalary")
{
ui->lineEdit_12->setText(xmlread.readElementText());
}
}
}
// 检查是否有错误发生
if (xmlread.hasError())
{
qDebug() << "解析XML时发生错误: " << xmlread.errorString();
return;
}
file.close();
}
void ReadWriteXml::writeXMLFile(QFile &file,const QString &fileName)
{
if(!openXMLFile(fileName))
{
qDebug()<<"打开xml文件写入失败,请重新检查";
return;
}
qDebug()<<"打开xml文件写入成功,请重新检查";
QXmlStreamWriter xmlwrite(&file);
//如果enable为真,则启用自动格式化,否则禁用它。默认值为false。
xmlwrite.setAutoFormatting(true);
// 写入 XML 文件内容
xmlwrite.writeStartDocument();//写入以XML版本号version开头的文档。
// 写入根元素
xmlwrite.writeStartElement("factory");
// 在此处添加更多的元素、属性和文本
xmlwrite.writeStartElement("worker");
//xmlwrite.writeAttribute("id","1"); //父节点的标识id=1
//xmlwrite.writeTextElement("name","lixin");
//xmlwrite.writeTextElement("sex","男");
{
//创建子节点
xmlwrite.writeStartElement("WNo");//写入一个起始元素标签。
xmlwrite.writeCharacters(ui->lineEdit->text());//写入文本内容。
xmlwrite.writeEndElement();//写入一个结束元素标签。
xmlwrite.writeStartElement("WName");//写入一个起始元素标签。
xmlwrite.writeCharacters(ui->lineEdit_2->text());//写入文本内容。
xmlwrite.writeEndElement();//写入一个结束元素标签。
xmlwrite.writeStartElement("WSex");//写入一个起始元素标签。
xmlwrite.writeCharacters(ui->lineEdit_3->text());//写入文本内容。
xmlwrite.writeEndElement();//写入一个结束元素标签。
xmlwrite.writeStartElement("WEducation");//写入一个起始元素标签。
xmlwrite.writeCharacters(ui->lineEdit_4->text());//写入文本内容。
xmlwrite.writeEndElement();//写入一个结束元素标签。
xmlwrite.writeStartElement("WDepartment");//写入一个起始元素标签。
xmlwrite.writeCharacters(ui->lineEdit_5->text());//写入文本内容。
xmlwrite.writeEndElement();//写入一个结束元素标签。
xmlwrite.writeStartElement("WSalary");//写入一个起始元素标签。
xmlwrite.writeCharacters(ui->lineEdit_6->text());//写入文本内容。
xmlwrite.writeEndElement();//写入一个结束元素标签。
}
// 关闭父节点
xmlwrite.writeEndElement();//关闭前一个开始元素
// 关闭根节点
xmlwrite.writeEndDocument();
file.close();
}
void ReadWriteXml::on_pushButton_write_clicked()
{
writeXMLFile(m_qfile,strcurrentfilename);
}
void ReadWriteXml::on_pushButton_read_clicked()
{
readXMLFile(m_qfile,strcurrentfilename);
}