Qt下实现XML、INI、JSON的文件读写示例开发
文章目录
- 前言
- 一、XML文件
- 二、INI文件
- 三、JSON文件
- 四、示例代码及文件内容
- 五、下载链接
- 总结
前言
在项目开发过程中,发现经常遇见一些比如XML、INI、JSON等文件的读写,这里对这些文件进行整理和汇总,并展示一个简单的demo来实现上述文件的读写,以便大家学习,如有错误之处,欢迎大家批评指正。
项目效果
提示:以下是本篇文章正文内容,下面案例可供参考
一、XML文件
XML是可扩展标记语言,是一种通用的文本格式,被广泛运用于数据交换和数据存储,也可以用作配置文件。
在Qt中有三种方式来进行xml文件的读取:
1.使用XML流,读:QXmlStreamReader 写:QXmlStreamWriter
2.使用DOM读写
3.SAX为XML解析器提供了一个基于事件的标准接口
其中本文示例中使用的是第一种方式来进行读写,需要包含以下头文件,具体实现方式可看下文完整代码
//xml
#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
二、INI文件
INI文件即初始化文件,通常存放的是一个程序的初始化信息,常用来做配置文件,其结构比较简单,由节、键、值组成,比较容易操作。
在Qt中可以使用QSettings类来进行ini文件的读写,需要包含以下头文件,具体实现方式可看下文完整代码
//ini
#include <QSettings>
三、JSON文件
JSON是一种轻量级的数据交换格式,它基于JavaScript的一个子集,易于人的编写和阅读,也易于机器解析,json 文件由对象和数组组成。
本文的demo中读写的json文件比较简单,只有对象,但是在使用到数组的情况下需要包含以下头文件,具体实现方式可看下文完整代码
//json
#include <QJsonObject> //对象
#include <QJsonArray> //数组
#include <QJsonDocument>
四、示例代码及文件内容
1.widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMessageBox>
#include <QDebug>//xml
#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>//ini
#include <QSettings>//json
#include <QJsonObject>
#include <QJsonDocument>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEtypedef struct person
{QString name;QString gender;int age;double height;double weight;
}PersonData;class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void xmlFlieRead();bool xmlFileWrite();void iniFileRead();bool iniFileWrite();void jsonFileRead();bool jsonFileWrite();void setFileValue(QString fileType);void showFileValue(QString fileType);private slots:void on_pb_xmlRead_clicked();void on_pb_xmlWrite_clicked();void on_pb_iniRead_clicked();void on_pb_iniWrite_clicked();void on_pb_jsonRead_clicked();void on_pb_jsonWrite_clicked();private:Ui::Widget *ui;PersonData xmlData;PersonData iniData;PersonData jsonData;};
#endif // WIDGET_H
2.widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->xmlFlieRead(); //初始化读取xml文件
}Widget::~Widget()
{delete ui;
}void Widget::xmlFlieRead()
{QString xmlFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/xmlFile.xml";QFile file(xmlFile);if(!file.open(QFile::ReadOnly | QFile::Text)){QMessageBox::warning(this,"警告","xml文件打开失败!");return;}QXmlStreamReader xmlRead;xmlRead.setDevice(&file);if(xmlRead.readNextStartElement()) //读取root{if(xmlRead.name().toString() == "root"){if(xmlRead.readNextStartElement()) //读取config{if(xmlRead.name().toString() == "config"){while(xmlRead.readNextStartElement()) //循环读取Item{if(xmlRead.name().toString() == "Item"){QXmlStreamAttributes attributes = xmlRead.attributes();if(attributes.hasAttribute("Name")){QString s_name = attributes.value("Name").toString();//qDebug()<<"s_name:"<<s_name;if(s_name == "name"){xmlData.name = xmlRead.readElementText();}else if(s_name == "gender"){xmlData.gender = xmlRead.readElementText();}else if(s_name == "age"){xmlData.age = xmlRead.readElementText().toInt();}else if(s_name == "height"){xmlData.height = xmlRead.readElementText().toDouble();}else if(s_name == "weight"){xmlData.weight = xmlRead.readElementText().toDouble();}else{qDebug()<<"readItem error";xmlRead.readNextStartElement();}}}}}}}}//更新界面showFileValue("xml");
}bool Widget::xmlFileWrite()
{QString xmlFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/xmlFile.xml";QFile file(xmlFile);if(!file.open(QFile::WriteOnly | QFile::Text | QFile :: Truncate)){return false;}QXmlStreamWriter xmlWrite(&file);xmlWrite.setAutoFormatting(true);xmlWrite.writeStartDocument("1.0",true);xmlWrite.writeStartElement("root");xmlWrite.writeStartElement("config");xmlWrite.writeAttribute("filename","xmlFile.xml");xmlWrite.writeStartElement ("Item");xmlWrite.writeAttribute("Name","name");xmlWrite.writeAttribute("Type","string");xmlWrite.writeAttribute("Note","姓名");xmlWrite.writeCharacters(xmlData.name);xmlWrite.writeEndElement();xmlWrite.writeStartElement ("Item");xmlWrite.writeAttribute("Name","gender");xmlWrite.writeAttribute("Type","string");xmlWrite.writeAttribute("Note","性别");xmlWrite.writeCharacters(xmlData.gender);xmlWrite.writeEndElement();xmlWrite.writeStartElement ("Item");xmlWrite.writeAttribute("Name","age");xmlWrite.writeAttribute("Type","int");xmlWrite.writeAttribute("Note","年龄");xmlWrite.writeCharacters(QString::number(xmlData.age));xmlWrite.writeEndElement();xmlWrite.writeStartElement ("Item");xmlWrite.writeAttribute("Name","height");xmlWrite.writeAttribute("Type","double");xmlWrite.writeAttribute("Note","身高");xmlWrite.writeCharacters(QString::number(xmlData.height));xmlWrite.writeEndElement();xmlWrite.writeStartElement ("Item");xmlWrite.writeAttribute("Name","weight");xmlWrite.writeAttribute("Type","double");xmlWrite.writeAttribute("Note","体重");xmlWrite.writeCharacters(QString::number(xmlData.weight));xmlWrite.writeEndElement();xmlWrite.writeEndElement(); //config结束xmlWrite.writeEndElement(); //root结束xmlWrite.writeEndDocument(); //Document结束file.close();return true;
}void Widget::iniFileRead()
{QString iniFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/iniFile.ini";QSettings iniRead(iniFile,QSettings::IniFormat);iniRead.setIniCodec("UTF-8"); //注意编码iniRead.beginGroup("VALUE");iniData.name = iniRead.value("name").toString();iniData.gender = iniRead.value("gender").toString();iniData.age = iniRead.value("age").toInt();iniData.height = iniRead.value("height").toDouble();iniData.weight = iniRead.value("weight").toDouble();iniRead.endGroup();//更新界面showFileValue("ini");
}bool Widget::iniFileWrite()
{QString iniFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/iniFile.ini";QSettings iniWrite(iniFile,QSettings::IniFormat);iniWrite.setIniCodec("UTF-8"); //注意编码,解决中文字符乱码iniWrite.beginGroup("VALUE");iniWrite.setValue("name",iniData.name);iniWrite.setValue("gender",iniData.gender);iniWrite.setValue("age",iniData.age);iniWrite.setValue("height",iniData.height);iniWrite.setValue("weight",iniData.weight);iniWrite.endGroup();return true;
}void Widget::jsonFileRead()
{QString jsonFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/jsonFile.json";QFile file(jsonFile);if(!file.open(QIODevice::ReadOnly)){QMessageBox::warning(this,"警告","json文件打开失败!");return;}QByteArray data(file.readAll());file.close();QJsonParseError jError;QJsonDocument jDoc = QJsonDocument::fromJson(data,&jError);if(jError.error != QJsonParseError::NoError){QMessageBox::critical(this,"错误","json文件错误!");return;}QJsonObject mainObject = jDoc.object();{jsonData.name = mainObject["name"].toString();jsonData.gender = mainObject["gender"].toString();jsonData.age = mainObject["age"].toInt();jsonData.height = mainObject["height"].toDouble();jsonData.weight = mainObject["weight"].toDouble();}//更新界面showFileValue("json");
}bool Widget::jsonFileWrite()
{QJsonObject mainObject; //读写比较复杂的json文件,可以使用大括号来方便区分{mainObject.insert("name",jsonData.name);mainObject.insert("gender",jsonData.gender);mainObject.insert("age",jsonData.age);mainObject.insert("height",jsonData.height);mainObject.insert("weight",jsonData.weight);}QJsonDocument jDoc(mainObject);QString jsonFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/jsonFile.json";QFile file(jsonFile);if(!file.open(QIODevice::WriteOnly)){return false;}QByteArray data(jDoc.toJson());file.write(data);file.close();return true;
}void Widget::setFileValue(QString fileType)
{if(fileType == "xml"){xmlData.name = ui->le_name->text();xmlData.gender = ui->cb_gender->currentText();xmlData.age = ui->le_age->text().toInt();xmlData.height = ui->le_height->text().toDouble();xmlData.weight = ui->le_weight->text().toDouble();}else if(fileType == "ini"){iniData.name = ui->le_name->text();iniData.gender = ui->cb_gender->currentText();iniData.age = ui->le_age->text().toInt();iniData.height = ui->le_height->text().toDouble();iniData.weight = ui->le_weight->text().toDouble();}else if(fileType == "json"){jsonData.name = ui->le_name->text();jsonData.gender = ui->cb_gender->currentText();jsonData.age = ui->le_age->text().toInt();jsonData.height = ui->le_height->text().toDouble();jsonData.weight = ui->le_weight->text().toDouble();}
}void Widget::showFileValue(QString fileType)
{if(fileType == "xml"){ui->le_name->setText(xmlData.name);if(xmlData.gender == "男"){ui->cb_gender->setCurrentIndex(0);}else if(xmlData.gender == "女"){ui->cb_gender->setCurrentIndex(1);}else{ui->cb_gender->setCurrentIndex(0);}ui->le_age->setText(QString::number(xmlData.age));ui->le_height->setText(QString::number(xmlData.height));ui->le_weight->setText(QString::number(xmlData.weight));}else if(fileType == "ini"){ui->le_name->setText(iniData.name);if(iniData.gender == "男"){ui->cb_gender->setCurrentIndex(0);}else{ui->cb_gender->setCurrentIndex(1);}ui->le_age->setText(QString::number(iniData.age));ui->le_height->setText(QString::number(iniData.height));ui->le_weight->setText(QString::number(iniData.weight));}else if(fileType == "json"){ui->le_name->setText(jsonData.name);if(jsonData.gender == "男"){ui->cb_gender->setCurrentIndex(0);}else{ui->cb_gender->setCurrentIndex(1);}ui->le_age->setText(QString::number(jsonData.age));ui->le_height->setText(QString::number(jsonData.height));ui->le_weight->setText(QString::number(jsonData.weight));}
}void Widget::on_pb_xmlRead_clicked()
{xmlFlieRead();
}void Widget::on_pb_xmlWrite_clicked()
{setFileValue("xml");if(xmlFileWrite()){QMessageBox::information(this,"提示","xml文件保存成功!");}
}void Widget::on_pb_iniRead_clicked()
{iniFileRead();
}void Widget::on_pb_iniWrite_clicked()
{setFileValue("ini");if(iniFileWrite()){QMessageBox::information(this,"提示","ini文件保存成功!");}
}void Widget::on_pb_jsonRead_clicked()
{jsonFileRead();
}void Widget::on_pb_jsonWrite_clicked()
{setFileValue("json");if(jsonFileWrite()){QMessageBox::information(this,"提示","json文件保存成功!");}
}
3.widget.ui
4.示例中各文件的内容
五、下载链接
我的示例百度网盘链接:https://pan.baidu.com/s/1M1Flq0-1lj4A5KV3sRdLUw
提取码:xxcj
总结
可以看到本文demo中所进行读写的几个文件都是比较简单的,内容比较少并且结构也比较简易,这里也只是为大家展示基本的读写方法。但是在实际的开发过程中,文件内容会存在循环,嵌套等等的复杂结构,对于相关的文件大家可以查看文末的参考文章。在我们的开发过程中需要注意观察,其实这几种类型的文件读写都是比较简单的,本质上都是获取参数,进行文件写,读取参数,界面显示读到的参数。另外在实际开发中,建议先进行写文件,再然后读,这样感觉开发起来简单(哈哈这是我自己的感jio~~~)。
hello:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。
参考文章:
QT中读取XML文件三种方式的实例
Qt读写ini文件
JSON简介
Qt 操作Json格式文件(创建、插入、解析、修改、删除)
Qt下实现XML、INI、JSON的文件读写示例开发相关推荐
- OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作
OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作 一.Write_XML_and_YAML_File(写入XML) #include <opencv2/opencv ...
- java 如何导出json文件_java导出json格式文件的示例代码
本文介绍了java导出json格式文件的示例代码,分享给大家,具体如下: import java.io.File; import java.io.FileWriter; import java.io. ...
- Qt下使用vs编译的库文件
Qt下调用VS制作的静态库 1.制作静态库的编译器和Qt版本的编译器是一样 如果是使用Visual Studio 制作的静态库,比如使用Visual Studio 2013制作的,而要使 ...
- python json转xml_Python中xml和json格式相互转换操作示例
本文实例讲述了Python中xml和json格式相互转换操作.分享给大家供大家参考,具体如下: Python中xml和json格式是可以互转的,就像json格式转Python字典对象那样. xml格式 ...
- ios本地文件内容读取,.json .plist 文件读写
本地文件.json .plist文件是较为常用的存储本地数据的文件,对这些文件的操作也是一种常用的基础. 本文同时提供初始化变量的比较标准的写法,如果你有更好的初始化变量的写法,欢迎留言提醒我. .j ...
- java流读写_java流概述以及文件读写示例
1. 先分清楚是字节流还是字符流. 字节流:InputStream OutputStream 字符流:Reader Writer 字符流与字节流的区别是读取的单位长度不同,字节流读8字节,字符流读16 ...
- linux 目录 读写,Linux C 文件与目录3 文件读写(示例代码)
文件读写 文件读写是指从文件中读出信息或将信息写入到文件中.Linux文件读取可使用read函数来实现的,文件写入可使用write函数来实现.在进行文件写入的操作时,只是在文件的缓冲区中操作,可能没有 ...
- context.xml mysql_在tomcat下context.xml中配置各种数据库连接池(示例代码)
Tomcat6的服务器配置文件放在 ${tomcat6}/conf 目录底下.我们可以在这里找到 server.xml 和 context.xml.当然,还有其他一些资源文件.但是在在本文中我们只用得 ...
- oracle中app文件夹下,Oracle Form开发之folder(文件夹)功能开发(一)
一.模板制作:YSFOLDER.FMB 打开TEMPLATE.FMB,如果打开的是APPSTAND.FMB,以下步骤省略: 1.FORM级触发器: 1.在WHEN-NEW-FORM-INSTANCE后 ...
最新文章
- 前端和后端的英文_前端工程师一般都喜欢去哪些网站逛?
- 不等于在python中怎么打_python中的不等于号怎么写
- Bootstrap表格表单
- 如何批量将 webp 格式的图片转换为 jpg 格式
- npm安装vant(有赞UI)框架 - cmd篇
- shape from shading
- 【Python】P2191 小Z的情书
- vim从入门到丝滑学习笔记
- 什么是BlockingQueue
- 将边缘云装进胶囊数据中心需要几步?
- 为什么要做网站备案?
- Win10下载Ubuntu Linux虚拟机设置管理员名称时无法通过NAME_REGEX的检查,--force-badname也无法通过
- 什么叫“全力以赴”?
- Android 开发 Tip 3 -- that was originally added here
- 深大和南科大计算机,南方科技大学和深圳大学,到底哪一所的性价比高呢
- OpenRASP管理后台安装(亲测)
- Windows10下Linux子系统Ubuntu使用教程(1)——安装
- linux生成文件清单,技术|使用 Linux stat 命令创建灵活的文件列表
- 周岭《认知觉醒》读书笔记
- 物联网 阿里云 电信云 移动oneNET 腾讯云 华为云 能接入的NBIOT通信协议
热门文章
- 开源 串口调试助手 BaoYuanSerial 使用教程
- 隔板法详解(各种方法)(转载)
- 手机html swf文件,【转载】在HTML中插入swf文件(转)
- 图像的平滑滤波、边缘检测、阈值化、腐蚀膨胀等原理介绍
- android ui 框架
- protocol buffer编码原理,让你理解pb是如何实现的
- 微软服务器无法连接,wsus无法连接同步微软更新服务器
- 周育如的音标口诀大全_英标发音表记忆口诀 这些顺口溜可以学起来
- 【JS】postMessage 用法(可以给iframe传值)
- 基于springboot+vue的大学生交友活动管理网站 elementui