Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB

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;

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
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
C

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

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

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

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

Comments

Only authorized users can post comments.
Please, Log in or Sign up
МБ
April 21, 2019, 9:40 a.m.
Моисей Бушуев

Qt - Test 001. Signals and slots

  • Result:0points,
  • Rating points-10
AA
April 17, 2019, 7:40 p.m.
Anton Ablin

Qt - Test 001. Signals and slots

  • Result:73points,
  • Rating points1
E
April 17, 2019, 6:16 p.m.
Evgeny

Qt - Test 001. Signals and slots

  • Result:100points,
  • Rating points10
Last comments
April 21, 2019, 4:22 p.m.
Евгений Легоцкой

Через метод setIcon table.horizontalHeaderItem(0).setIcon("qrc://path/to/icon.png")
April 21, 2019, 3:48 p.m.
Евгений Легоцкой

Добрый день! Спасибо за комментарий. Там действительно лучше будет сделать с инициализацией по умолчанию.
U
April 18, 2019, 3:37 p.m.
Unreal_man

А как иконку в хедер задать?
u
April 18, 2019, 2:15 a.m.
uaa

доброго времени,большое спасибо за пример для начинающего)при адаптации к своему проекту столкнулся с таким ньансом:в vepolyline.h в 47 строке нужна инициализация по умолчанию: int m_pointF...
E
April 11, 2019, 12:49 p.m.
Evgeny

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.
Now discuss on the forum
April 24, 2019, 11:22 a.m.
Ruslan Polupan

Согласен. но ситуация не поменялась. Такое чуство что данные не записываются в модель.
April 24, 2019, 6:20 a.m.
Ruslan Polupan

я так понимаю надо инфорация об устройствах.Я бы пробовал так rust@suse:~> lsblk -PNAME="sda" MAJ:MIN="8:0" RM="0" SIZE="111,8G" RO="0" TYPE="disk" MOUNTPOINT=""NAME="sda1" MAJ:MIN="8...
April 21, 2019, 4:16 p.m.
Евгений Легоцкой

Приветствую Нужно сохранять где-то выбранное значение, а потом восстанавливать его. Или использовать QSettings или добавить метод open(), в который передавать начальные значения для того...
R
April 19, 2019, 9:55 a.m.
RED_Spider

мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread
Join us in social networks

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