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

Qt, QXmlStreamReader, QXmlStreamWriter, XML, xml example

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;


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.


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


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

namespace Ui {
class MainWindow;

class MainWindow : public QMainWindow

    explicit MainWindow(QWidget *parent = 0);

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();

    Ui::MainWindow *ui;

#endif // MAINWINDOW_H


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) :
    ui(new Ui::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());

    /* 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
     * */
                             (ui->checkBox->isChecked() ? "true" : "false"));
    /* We write in the body of this element from the corresponding line qlineEdit
     * */
    xmlWriter.writeEndElement();        // Закрываем тег

    /* Repeat the same procedure for the other two checkboxes
     * */
                             (ui->checkBox_2->isChecked() ? "true" : "false"));

                             (ui->checkBox_3->isChecked() ? "true" : "false"));

    /* Close tag "resources"
     * */
    /* Finish the writing in the document
     * */
    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 != ""){
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))
                             "Ошибка файла",
                             "Не удалось открыть файл",
    } else {
        /* Create an object, through which the reading of the file */
        QXmlStreamReader xmlReader;
        xmlReader.readNext();   // Moves to the first item in the file

        /* Work in a loop as long as we reach the end of the document
         * */
            /* Check whether the beginning of the tag element
             * */
                /* 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
                     * */

                    /* 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);
                } 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);
            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 != ""){

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"?>
    <checkBox_1 boolean="false">XML</checkBox_1>
    <checkBox_2 boolean="false">Example</checkBox_2>
    <checkBox_3 boolean="true">EVILEG</checkBox_3>


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
Virtual hosting with 10 percent discount
Virtual hosting with 10 percent discount
EVILEG offers reliable hosting with a 10% discount for virtual hosting and 5% for VPS
Support the author Donate

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

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

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

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


Only authorized users can post comments.
Please, Log in or Sign up
Looking for a Job?
14,000.00 руб. - 40,000.00 руб.
Разработчик Qt
Annino, Moscow Oblast, Russia
5,000.00 руб. - 15,000.00 руб.
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

Aug. 22, 2019, 11:24 p.m.

Qt - Test 001. Signals and slots

  • Result:47points,
  • Rating points-6
Aug. 21, 2019, 10:23 a.m.
Andrej Ermoshin

C++ - Test 002. Constants

  • Result:58points,
  • Rating points-2
Aug. 21, 2019, 10:15 a.m.
Andrej Ermoshin

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

  • Result:86points,
  • Rating points6
Last comments
Aug. 19, 2019, 7:41 a.m.
Andrej Jankovich

это проблема дистрибутива, попробуйте установить через пакетный менеджер snap Суть проблемы: libQt5Core которая лежит в дистрибутиве требует версию glibc >= 2.25 у вас видимо …
Aug. 18, 2019, 6:09 a.m.

cqtdeployer /home/aleks/CQtDeployer/bin/cqtdeployer: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by /home/aleks/CQtDeployer/lib/libQt5Core.so.5) linux mint …
Aug. 17, 2019, 9:04 a.m.

github ChekableTView Правой групповая смена значения при перетаскивании левой как обычно.
Aug. 16, 2019, 1:03 p.m.
Evgenij Legotskoj

Потому, что в минуте 60 секунд
Aug. 16, 2019, 12:16 p.m.

а почему делитель 60000, а не 1000?
Now discuss on the forum
Aug. 24, 2019, 7:21 a.m.
Evgenij Legotskoj

Не помню, давно уже с QML не работал, по-моему, обычно пишет в консоль, что не находит файл. В любом случае какую-то ошибку в консоль выкидывает. Но если честно, если у вас проект будет ак…
Aug. 24, 2019, 4:27 a.m.
Brjus Gliff

Спасибо, вначале в документации было не понятно что к чему, теперь разобрался
Aug. 21, 2019, 8:36 a.m.

Александр, мне не нужно перебирать. Вы говорите правильно, сначала я написал избыточный код просто не подумав. Задача такая, мне нужно просто переложить из QMap в атрибуты xml тега все, что там …
Aug. 21, 2019, 3:16 a.m.

Если Вы разрабатываете какую-то универсальную утилиту, которая вообще не привязана к логике, тогда как вариант: 1. Получить список таблиц через QSqlDatabase::tables 2. Для каждой табли…
© EVILEG 2015-2019
Recommend hosting TIMEWEB