Diretório de artigos
prefácio
No processo de desenvolvimento do projeto, muitas vezes verifica-se que alguns arquivos como XML, INI, JSON, etc. redação dos arquivos acima, para que todos possam aprender, como Se houver erros, todos são bem-vindos para criticar e corrigir.
efeito do projeto
提示:以下是本篇文章正文内容,下面案例可供参考
1. Arquivo XML
XML é Extensible Markup Language, um formato de texto comum, amplamente utilizado na troca e armazenamento de dados, podendo também ser utilizado como arquivo de configuração.
Existem três maneiras de ler arquivos xml em Qt:
1. Use fluxo XML, leia: QXmlStreamReader escreva: QXmlStreamWriter
2. Use DOM para ler e gravar
3. SAX fornece uma interface padrão baseada em eventos para analisadores XML
. primeiro método é usado para ler e gravar, e os seguintes arquivos de cabeçalho precisam ser incluídos. Para o método de implementação específico, consulte o código completo abaixo
//xml
#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
Dois, arquivo INI
O arquivo INI é um arquivo de inicialização. Geralmente armazena as informações de inicialização de um programa. É frequentemente usado como um arquivo de configuração. Sua estrutura é relativamente simples, consistindo de seções, chaves e valores, e é mais fácil de operar.
No Qt, você pode usar a classe QSettings para ler e gravar arquivos ini. Os seguintes arquivos de cabeçalho precisam ser incluídos. Para a implementação específica, veja o código completo abaixo.
//ini
#include <QSettings>
3. Arquivo JSON
JSON é um formato de troca de dados leve baseado em um subconjunto de JavaScript, que é fácil de escrever e ler por humanos e fácil de analisar por máquinas. Os arquivos JSON são compostos de objetos e matrizes.
O arquivo json lido e escrito no demo deste artigo é relativamente simples, apenas objetos, mas no caso de usar um array, os seguintes arquivos de cabeçalho precisam ser incluídos. Para a implementação específica, consulte o código completo abaixo
//json
#include <QJsonObject> //对象
#include <QJsonArray> //数组
#include <QJsonDocument>
4. Exemplo de código e conteúdo do arquivo
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_NAMESPACE
typedef struct person
{
QString name;
QString gender;
int age;
double height;
double weight;
}PersonData;
class Widget : public QWidget
{
Q_OBJECT
public:
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. Conteúdo de cada arquivo no exemplo
5. Link para download
Meu link de disco de rede Baidu de exemplo: https://pan.baidu.com/s/1M1Flq0-1lj4A5KV3sRdLUw
Código de extração: xxcj
Resumir
Pode-se observar que os vários arquivos lidos e escritos no demo deste artigo são relativamente simples, com menos conteúdo e uma estrutura relativamente simples, aqui apenas para mostrar os métodos básicos de leitura e escrita. No entanto, no processo de desenvolvimento real, haverá estruturas complexas como loops e aninhamento no conteúdo do arquivo. Para arquivos relacionados, você pode verificar os artigos de referência no final do artigo. Precisamos prestar atenção à observação durante nosso processo de desenvolvimento. Na verdade, esses tipos de leitura e gravação de arquivos são relativamente simples. Em essência, trata-se de obter parâmetros, gravar arquivos, ler parâmetros e exibir os parâmetros de leitura na interface . Além disso, no desenvolvimento real, é recomendável escrever o arquivo primeiro e depois lê-lo, para que seja fácil de desenvolver (haha, esse é o meu sentimento jio~~~).
Olá:
Aprendam juntos e progridam juntos.Se você ainda tiver dúvidas relacionadas, pode deixar uma mensagem na área de comentários para discussão.
Artigo de referência:
Exemplos de três maneiras de ler arquivos XML no QT
Qt lê e grava arquivos ini
Introdução JSON
Qt opera arquivos no formato Json (criar, inserir, analisar, modificar, excluir)