QtでのXML、INI、JSONファイルの読み書きサンプル開発の実装


序文

プロジェクト開発の過程で、XML、INI、JSON などのファイルの読み書きが頻繁に行われることがありますが、ここではこれらのファイルを整理してまとめ、読み込みと書き込みを実現するための簡単なデモを示します。上記のファイルを作成して、誰もが学習できるようにします。たとえば、間違いがあれば、誰もが批判して修正することを歓迎します。

事業効果画像の説明を追加してください


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

1.XMLファイル

XML は Extensible Markup Language であり、データ交換やデータ保存に広く使用されている一般的なテキスト形式であり、構成ファイルとしても使用できます。

Qt で XML ファイルを読み取るには 3 つの方法があります:
1. XML ストリームを使用し、読み取り: QXmlStreamReader 書き込み: QXmlStreamWriter 2. DOM
を使用して読み取りと書き込みを
行う 3. SAX は、XML パーサー用のイベントベースの標準インターフェイスを提供します。
最初のメソッドは読み取りと書き込みに使用され、次のヘッダー ファイルをインクルードする必要があります。具体的な実装方法については、以下の完全なコードを参照してください。

//xml
#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>

2、INIファイル

INI ファイルは初期化ファイルです。通常、プログラムの初期化情報が格納されます。設定ファイルとしてよく使用されます。その構造はセクション、キー、値で構成されており、操作が簡単です。

Qt では、QSettings クラスを使用して ini ファイルの読み取りと書き込みを行うことができます。次のヘッダー ファイルを含める必要があります。具体的な実装については、以下の完全なコードを参照してください。

//ini
#include <QSettings>

3.JSONファイル

JSON は JavaScript のサブセットに基づく軽量のデータ交換形式で、人間による書き込みと読み取り、マシンによる解析が容易です。JSON ファイルはオブジェクトと配列で構成されます。

この記事のデモで読み書きする json ファイルはオブジェクトのみで比較的シンプルですが、配列を使用する場合は以下のヘッダー ファイルを含める必要があります。具体的な実装については、以下の完全なコードを参照してください。

//json
#include <QJsonObject>   //对象
#include <QJsonArray>    //数组
#include <QJsonDocument>

4. サンプルコードとファイルの内容

1.ウィジェット.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.ウィジェット.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.ウィジェット.ui画像の説明を追加してください

4. 例の各ファイルの内容
画像の説明を追加してください

5. ダウンロードリンク

私の Baidu ネットワーク ディスク リンクの例: https://pan.baidu.com/s/1M1Flq0-1lj4A5KV3sRdLUw
抽出コード: xxcj


要約する

この記事のデモで読み書きされるいくつかのファイルは、内容が少なく、構造も比較的単純であることがわかります。ここでは、基本的な読み書き方法を示すだけです。ただし、実際の開発ではファイル内容にループやネストなどの複雑な構造が含まれるため、関連ファイルについては記事末尾の参考記事をご確認ください。開発プロセスでは観察に注意を払う必要があります。実際、この種のファイルの読み取りと書き込みは比較的単純です。本質的には、パラメーターの取得、ファイルの書き込み、パラメーターの読み取り、インターフェイス上での読み取りパラメーターの表示に関するものです。なお、実際の開発では、先にファイルを書いてから読み込むと開発しやすいのでおすすめです(笑、これは私の感覚ですよ~~~)。


こんにちは:
一緒に学び、一緒に進歩しましょう。関連する質問がまだある場合は、ディスカッションのためにコメント領域にメッセージを残すことができます。

参考記事:
QTでXMLファイルを読み取る3つの方法の例
Qtはiniファイルを読み書きする
JSON はじめに
QtはJson形式ファイルの操作(作成、挿入、解析、変更、削除)

おすすめ

転載: blog.csdn.net/XCJandLL/article/details/127775991