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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

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

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

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

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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