Implementação de desenvolvimento de exemplo de leitura e gravação de arquivos XML, INI, JSON em Qt


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 projetoAdicione uma descrição da imagem


提示:以下是本篇文章正文内容,下面案例可供参考

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.uiAdicione uma descrição da imagem

4. Conteúdo de cada arquivo no exemplo
Adicione uma descrição da imagem

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)

Acho que você gosta

Origin blog.csdn.net/XCJandLL/article/details/127775991
Recomendado
Clasificación