Evgenii Legotckoi
Evgenii LegotckoiAug. 28, 2015, 9:34 a.m.

Qt/C++ - Lesson 011. XML files in Qt – Reading and Writing

Qt development tools include functionality for working with XML files, which allows you to create XML files and read them, which may be useful to create the automatic creation of XML markup software, configuration files, using XML, or for parsing XML-files .

To record in an XML file format used QXmlStreamWriter class, while the other is used QXmlStreamReader class to read an XML file.

The project structure for working with XML file

This project uses the minimum number of files:

  • XMLExample.pro - profile;
  • mainwindow.h - header file of the main application window;
  • mainwindow.cpp - source of window;
  • main.cpp - the main source file from which the application starts;
  • mainwindow.ui - form of the main application window;

mainwindow.ui

At this time in the form of the main window, you must add a sufficiently large number of items to make it look like this:

The main window of the application to work with an XML file List of all the elements with which the work will be done in code:

  • checkBox - first checkbox;
  • checkBox_1 - the second Checkbox;
  • checkBox_2 - third checkbox;
  • lineEditCB1 - lineEdit for the first checkbox;
  • lineEditCB2 - lineEdit second checkbox;
  • lineEditCB3 - lineEdit for the third checkbox;
  • lineEditRead - lineEdit, which specifies the path to the file for reading;
  • lineEditWrite - lineEdit, which indicates the path to the file for writing;
  • dialogReadButton - button to call up the dialog to save the file in this case is simple file selection, which will be carried out the work;
  • dialogButton - button to call up the file recording the dialogue, in this case, the file is simply a choice, which will also be carried out work;
  • readButton - key performance reading from a file;
  • generateButton - button to record a file.

mainwindow.h

In the header file for the library connected with QXmlStreamWriter and QXmlStreamReader. Also announced slots handlers keystrokes.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>
#include <QXmlStreamWriter>
#include <QXmlStreamReader>
#include <QXmlStreamAttribute>
#include <QMessageBox>
#include <QFile>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    /* Slots handlers buttons which work with the record in the file */
    void on_generateButton_clicked();
    void on_dialogButton_clicked();

    /* Slots handlers buttons which work with the reading in the file */
    void on_readButton_clicked();
    void on_dialogReadButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

This source file reads and writes data into XML-file as well as the substitution of the parameters of the XML-file in the form of the main window.

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

/* The method performs recording of information in XML-file
 * */
void MainWindow::on_generateButton_clicked()
{
    /* Open the file for writing using the path specified in lineEditWrite */
    QFile file(ui->lineEditWrite->text());
    file.open(QIODevice::WriteOnly);

    /* Create an object, through which the recording to file */
    QXmlStreamWriter xmlWriter(&file);
    xmlWriter.setAutoFormatting(true);  // Set the auto-formatting text
    xmlWriter.writeStartDocument();     // run record in a document
    xmlWriter.writeStartElement("resources");   // Write the first element of his name

    xmlWriter.writeStartElement("checkBox_1");  // Write tag with the name for the first checkbox
    /* On the basis of the state of the checkbox attribute record "boolean" 
     * indicating the state of the checkbox in this attribute
     * */
    xmlWriter.writeAttribute("boolean",
                             (ui->checkBox->isChecked() ? "true" : "false"));
    /* We write in the body of this element from the corresponding line qlineEdit
     * */
    xmlWriter.writeCharacters(ui->lineEditCB1->text());
    xmlWriter.writeEndElement();        // Закрываем тег


    /* Repeat the same procedure for the other two checkboxes
     * */
    xmlWriter.writeStartElement("checkBox_2");
    xmlWriter.writeAttribute("boolean",
                             (ui->checkBox_2->isChecked() ? "true" : "false"));
    xmlWriter.writeCharacters(ui->lineEditCB2->text());
    xmlWriter.writeEndElement();

    xmlWriter.writeStartElement("checkBox_3");
    xmlWriter.writeAttribute("boolean",
                             (ui->checkBox_3->isChecked() ? "true" : "false"));
    xmlWriter.writeCharacters(ui->lineEditCB3->text());
    xmlWriter.writeEndElement();

    /* Close tag "resources"
     * */
    xmlWriter.writeEndElement();
    /* Finish the writing in the document
     * */
    xmlWriter.writeEndDocument();
    file.close();   // Закрываем файл
}

/* The method, which causes the file selection dialog box to save the data
 * */
void MainWindow::on_dialogButton_clicked()
{
    /* Call the file selection dialog to save */
    QString filename = QFileDialog::getSaveFileName(this,
                                           tr("Save Xml"), ".",
                                           tr("Xml files (*.xml)"));
    /* Set in lineEditWrite path to the file, with which we will work */
    if(filename != ""){
        ui->lineEditWrite->setText(filename);
    }
}

void MainWindow::on_readButton_clicked()
{
    /* Open the file for reading by using the path specified in lineEditWrite */
    QFile file(ui->lineEditRead->text());
    if (!file.open(QFile::ReadOnly | QFile::Text))
    {
        QMessageBox::warning(this,
                             "Ошибка файла",
                             "Не удалось открыть файл",
                             QMessageBox::Ok);
    } else {
        /* Create an object, through which the reading of the file */
        QXmlStreamReader xmlReader;
        xmlReader.setDevice(&file);
        xmlReader.readNext();   // Moves to the first item in the file

        /* Work in a loop as long as we reach the end of the document
         * */
        while(!xmlReader.atEnd())
        {
            /* Check whether the beginning of the tag element
             * */
            if(xmlReader.isStartElement())
            {
                /* Check whether the tag refers to one of the checkboxes. 
                 * If "YES", then a check attribute checkbox and records for lineEdit
                 * */
                if(xmlReader.name() == "checkBox_1")
                {
                    /* Taking all of the tag attributes, 
                     * and through them to check for compliance with the required attribute to us
                     * */
                    foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()) {
                        /* If the attribute is found, then its value is set the state of the checkbox
                         * */
                        if (attr.name().toString() == "boolean") {
                            QString attribute_value = attr.value().toString();
                            ui->checkBox->setChecked((QString::compare(attribute_value , "true") == 0) ? true : false);

                        }
                    }
                    /* pick up text from the body tag and paste it appropriate qlineEdit
                     * */
                    ui->lineEditCB1->setText(xmlReader.readElementText());

                    /* similar to working with other tags */
                } else if (xmlReader.name() == "checkBox_2"){
                    foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()) {
                        if (attr.name().toString() == "boolean") {
                            QString attribute_value = attr.value().toString();
                            ui->checkBox_2->setChecked((QString::compare(attribute_value , "true") == 0) ? true : false);

                        }
                    }
                    ui->lineEditCB2->setText(xmlReader.readElementText());
                } else if (xmlReader.name() == "checkBox_3"){
                    foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()) {
                        if (attr.name().toString() == "boolean") {
                            QString attribute_value = attr.value().toString();
                            ui->checkBox_3->setChecked((QString::compare(attribute_value , "true") == 0) ? true : false);

                        }
                    }
                    ui->lineEditCB3->setText(xmlReader.readElementText());
                }
            }
            xmlReader.readNext(); // Go to the next file element
        }
        file.close(); // Close the file

        /* This code is not checking for the closing tag because it is not necessary, 
         * but it allows the functional QXmlStreamReader
         * */
    }
}

/* The method, which causes the file selection dialog box to read the data
 * */
void MainWindow::on_dialogReadButton_clicked()
{
    /* Call the file selection dialog to read */
    QString filename = QFileDialog::getOpenFileName(this,
                                       tr("Open Xml"), ".",
                                       tr("Xml files (*.xml)"));
   /* Set in lineEditRead path to the file, which will work */
    if(filename != ""){
        ui->lineEditRead->setText(filename);
    }
}

As a result, we are able to create XML-file with the parameters and checkboxes our lineEdit types of objects, as well as to parse the file and set the data in the appropriate checkboxes and objects lineEdit.

The resulting file should be as follows:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <checkBox_1 boolean="false">XML</checkBox_1>
    <checkBox_2 boolean="false">Example</checkBox_2>
    <checkBox_3 boolean="true">EVILEG</checkBox_3>
</resources>

Result

As a result, should have the application that creates or rewrites the XML-file, taking data from the respective fields and checkboxes lineEdit, as well as producing the parsing of the XML-file data by setting the check boxes and fields lineEdit.

The application for working with XML files

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

C
  • Jan. 20, 2017, 1:40 p.m.

Не могли бы предоставить пример, где больше уровней в xml файле?

Evgenii Legotckoi
  • Jan. 20, 2017, 11:48 p.m.

Это конечно можно, но насколько больше? И применительно к какому виду... Всё упирается же в то, куда именно будет этот XML применяться.

Например, чтение данных из XML можно сделать и с помощью QDomDocument. А если учесть, что SVG файл также фактически является XML документом, то Вы можете посмотреть следующий пример, для ознакомления с вытягиванием данных из XML файла:

SvgReader на Qt. Восстановление данных из файла SVG в QGraphicsScene

Comments

Only authorized users can post comments.
Please, Log in or Sign up
e
  • ehot
  • March 31, 2024, 2:29 p.m.

C++ - Тест 003. Условия и циклы

  • Result:78points,
  • Rating points2
B

C++ - Test 002. Constants

  • Result:16points,
  • Rating points-10
B

C++ - Test 001. The first program and data types

  • Result:46points,
  • Rating points-6
Last comments
k
kmssrFeb. 8, 2024, 6:43 p.m.
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVADec. 25, 2023, 10:30 a.m.
Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJoDec. 25, 2023, 8:38 a.m.
Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
GvozdikDec. 18, 2023, 9:01 p.m.
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Now discuss on the forum
a
a_vlasovApril 14, 2024, 6:41 a.m.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел ДорофеевApril 14, 2024, 2:35 a.m.
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrexApril 4, 2024, 4:47 a.m.
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
AC
Alexandru CodreanuJan. 19, 2024, 11:57 a.m.
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

Follow us in social networks