Evgenii Legotckoi
Evgenii LegotckoiТам. 28, 2015, 9:34 Т.Ж.

Qt/C++ – Сабақ 011. Qt тіліндегі XML файлдары – оқу және жазу

Qt әзірлеу құралдары XML файлдарымен жұмыс істеуге арналған функционалдылықты қамтиды, бұл XML файлдарын жасауға және оларды оқуға мүмкіндік береді, бұл XML белгілеулерін, конфигурацияны автоматты түрде жасау үшін бағдарламаларды жасау үшін пайдалы болуы мүмкін. XML пайдаланатын файлдар немесе XML файлдарын талдау үшін.

QXmlStreamWriter класы XML файлдарын жазу үшін, ал басқа QXmlStreamReader. класы XML файлдарын оқу үшін пайдаланылады.

Код Qt 5.4.1 негізінде QtCreator 3.3.1-де жазылған.

XML файлымен жұмыс істеуге арналған жоба құрылымы

Бұл жоба ең аз файлдарды пайдаланады:

  • XMLExample.pro - профиль;
  • mainwindow.h – қосымшаның негізгі терезесінің тақырып файлы;
  • mainwindow.cpp – терезенің бастапқы коды;
  • main.cpp – қолданба басталатын негізгі бастапқы файл;
  • mainwindow.ui – қосымшаның негізгі терезесінің формасы;

mainwindow.ui

Бұл жолы біз негізгі терезе пішініне жеткілікті көп элементтерді қосуымыз керек, сонда ол келесідей болады:

XML файлымен жұмыс істеуге арналған қолданбаның негізгі терезесі Бағдарлама кодында өңделетін барлық элементтердің тізімі:

  • checkBox - бірінші құсбелгі;
  • checkBox_1 - екінші құсбелгі;
  • checkBox_2 - үшінші құсбелгі;
  • lineEditCB1 - бірінші құсбелгі үшін lineEdit;
  • lineEditCB2 - екінші құсбелгі үшін lineEdit;
  • lineEditCB3 - үшінші құсбелгі үшін lineEdit;
  • lineEditRead - оқылатын файлдың жолын көрсететін lineEdit;
  • lineEditWrite – жазылатын файлдың жолын көрсететін lineEdit;
  • dialogReadButton - файлды сақтау диалогын шақыру түймесі, бұл жағдайда жұмыс істеу үшін файлды таңдайсыз;
  • dialogButton – файлды жазуға арналған диалогты шақыру батырмасы, бұл жағдайда файлды таңдау жеткілікті, ол да жұмыс істейді;
  • readButton – файлдан оқуға арналған батырма;
  • generateButton - файлға жазу түймесі.

mainwindow.h

Тақырып файлы QXmlStreamWriter және QXmlStreamReader бағдарламаларымен жұмыс істеуге арналған кітапханаларды қамтиды.** Сондай-ақ, түймелерді басу өңдеушілеріне арналған ұяшықтар жарияланған.

#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:
    /* Слоты обработчиков кнопок, работающих с записью в файл */
    void on\_generateButton\_clicked();
    void on\_dialogButton\_clicked();

    /* Слоты обработчиков кнопок, работающих с чтением из файла */
    void on\_readButton\_clicked();
    void on\_dialogReadButton\_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW\_H

mainwindow.cpp

Бұл бастапқы файл XML файлына деректерді оқиды және жазады, сонымен қатар XML файлындағы параметрлерді негізгі терезенің пішіндеріне ауыстырады.

#include "mainwindow.h"
#include "ui\_mainwindow.h"

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

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

/* Метод, выполняющий запись информации в XML-файл
 * */
void MainWindow::on\_generateButton\_clicked()
{
    /* Открываем файл для Записи с помощью пути, указанного в lineEditWrite */
    QFile file(ui->lineEditWrite->text());
    file.open(QIODevice::WriteOnly);

    /* Создаем объект, с помощью которого осуществляется запись в файл */
    QXmlStreamWriter xmlWriter(&file);
    xmlWriter.setAutoFormatting(true);  // Устанавливаем автоформатирование текста
    xmlWriter.writeStartDocument();     // Запускаем запись в документ
    xmlWriter.writeStartElement("resources");   // Записываем первый элемент с его именем

    xmlWriter.writeStartElement("checkBox\_1");  // Записываем тег с именем для первого чекбокса
    /* На основе состояния чекбокса записываем атрибут "boolean"
     * с указанием состояния чекбокса в этом атрибуте
     * */
    xmlWriter.writeAttribute("boolean",
                             (ui->checkBox->isChecked() ? "true" : "false"));
    /* Записываем также в тело этого элемента строку из соответствующего lineEdit
     * */
    xmlWriter.writeCharacters(ui->lineEditCB1->text());
    xmlWriter.writeEndElement();        // Закрываем тег


    /* Повторяем те же действия для двух других чекбоксов
     * */
    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();

    /* Закрываем тег "resources"
     * */
    xmlWriter.writeEndElement();
    /* Завершаем запись в документ
     * */
    xmlWriter.writeEndDocument();
    file.close();   // Закрываем файл
}

/* Метод, вызывающий диалоговое окно выбора файла для сохранения данных
 * */
void MainWindow::on\_dialogButton\_clicked()
{
    /* Вызываем диалог выбора файла для сохранения */
    QString filename = QFileDialog::getSaveFileName(this,
                                           tr("Save Xml"), ".",
                                           tr("Xml files (*.xml)"));
    /* Устанавливаем в lineEditWrite путь к файлу, с которым будем работать */
    if(filename != ""){
        ui->lineEditWrite->setText(filename);
    }
}

void MainWindow::on\_readButton\_clicked()
{
    /* Открываем файл для Чтения с помощью пути, указанного в lineEditWrite */
    QFile file(ui->lineEditRead->text());
    if (!file.open(QFile::ReadOnly | QFile::Text))
    {
        QMessageBox::warning(this,
                             "Ошибка файла",
                             "Не удалось открыть файл",
                             QMessageBox::Ok);
    } else {
        /* Создаем объект, с помощью которого осуществляется чтение из файла */
        QXmlStreamReader xmlReader;
        xmlReader.setDevice(&file);
        xmlReader.readNext();   // Переходит к первому элементу в файле

        /* Крутимся в цикле до тех пор, пока не достигнем конца документа
         * */
        while(!xmlReader.atEnd())
        {
            /* Проверяем, является ли элемент началом тега
             * */
            if(xmlReader.isStartElement())
            {
                /* Проверяем, относится ли тег к одному из чекбоксов.
                 * Если "ДА", то выполняем проверку атрибута чекбокса
                 * и записи для lineEdit
                 * */
                if(xmlReader.name() == "checkBox\_1")
                {
                    /* Забираем все атрибуты тега и перебираем их для проверки на соответствие
                     * нужному нам атрибуту
                     * */
                    foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()) {
                        /* Если найден нужный атрибут, то по его значению устанавливаем
                         * состояние чекбокса
                         * */
                        if (attr.name().toString() == "boolean") {
                            QString attribute\_value = attr.value().toString();
                            ui->checkBox->setChecked((QString::compare(attribute\_value , "true") == 0) ? true : false);

                        }
                    }
                    /* забираем текст из тела тега и вставляем его соответствующий lineEdit
                     * */
                    ui->lineEditCB1->setText(xmlReader.readElementText());

                    /* аналогично работаем с остальными тегами */
                } 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(); // Переходим к следующему элементу файла
        }
        file.close(); // Закрываем файл

        /* В данном коде не осуществляется проверка на закрытие тега
         * поскольку в этом нет необходимости, но функционал QXmlStreamReader это позволяет
         * */
    }
}

/* Метод, вызывающий диалоговое окно выбора файла для чтения данных
 * */
void MainWindow::on\_dialogReadButton\_clicked()
{
    /* Вызываем диалог выбора файла для чтения */
    QString filename = QFileDialog::getOpenFileName(this,
                                       tr("Open Xml"), ".",
                                       tr("Xml files (*.xml)"));
   /* Устанавливаем в lineEditRead путь к файлу, с которым будем работать */
    if(filename != ""){
        ui->lineEditRead->setText(filename);
    }
}

Нәтижесінде құсбелгілер параметрлері бар XML файлын және lineEdit түріндегі нысандарымызды құруға, сондай-ақ осы файлды талдауға және алынған деректерді орнатуға мүмкіндік аламыз. сәйкес құсбелгілер және нысандар lineEdit.

Алынған файл келесідей болуы керек:

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

Барлығы

Нәтиже құсбелгілер және сәйкес lineEdit өрістерінен деректерді алып, осы XML файлын талдап, деректерді * етіп орнататын XML файлын жасайтын немесе қайта жазатын қолданба болуы керек. құсбелгілер және lineEdit * өрістері.

XML файлдарымен жұмыс істеуге арналған қосымша

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

C
  • Қаң. 20, 2017, 1:40 Т.Қ.

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

Evgenii Legotckoi
  • Қаң. 20, 2017, 11:48 Т.Қ.

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

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

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 5:38 Т.Қ.

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 11:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 10:51 Т.Қ.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚар. 1, 2024, 12:37 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 6:19 Т.Қ.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 5:51 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 9:02 Т.Қ.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 25, 2024, 1:11 Т.Ж.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 5:04 Т.Қ.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 1:49 Т.Қ.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 7:10 Т.Қ.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз