Skip to content

Практическая работа №19. Работа с JSON в Qt

  • Изучить формат JSON и его применение в C++ приложениях на базе фреймворка Qt.
  • Познакомиться с основными классами для работы с JSON: QJsonObject, QJsonArray, QJsonDocument.
  • Научиться реализовывать механизмы сохранения и загрузки настроек приложения (сериализация и десериализация).
  • Разработать текстовый редактор с функционалом запоминания состояния интерфейса.

1. Теоретические сведения

Section titled “1. Теоретические сведения”

JSON (JavaScript Object Notation) — это легковесный текстовый формат обмена данными, основанный на подмножестве языка JavaScript. Несмотря на название, он является языконезависимым и поддерживается практически всеми современными языками программирования.

Преимущества JSON:

  • Читаемость: данные представлены в текстовом виде, понятном человеку.
  • Структурированность: поддержка иерархических структур (вложенные объекты и массивы).
  • Компактность: меньший объем по сравнению с XML.

1.2 Основные типы данных в JSON

Section titled “1.2 Основные типы данных в JSON”
Тип данныхОписаниеПример
ОбъектНабор пар “ключ: значение”, заключенный в {}{"key": "value"}
МассивУпорядоченный список значений в [][1, 2, 3]
СтрокаТекст в двойных кавычках"Hello Qt"
ЧислоЦелое или дробное число42, 3.14
ЛогическийЗначения истина или ложьtrue, false
NullПустое значениеnull

1.3 Классы Qt для работы с JSON

Section titled “1.3 Классы Qt для работы с JSON”

Для работы с JSON в Qt (начиная с версии 5.0) используется модуль QtCore. Основные классы:

  1. QJsonValue: Инкапсулирует любое значение JSON (строку, число, объект и т.д.).
  2. QJsonObject: Представляет собой ассоциативный массив (объект JSON). Ключи всегда являются строками.
  3. QJsonArray: Представляет собой список значений (массив JSON).
  4. QJsonDocument: Позволяет преобразовывать JSON-структуры в текстовое (UTF-8) или бинарное представление и обратно.

2. Примеры реализации на C++

Section titled “2. Примеры реализации на C++”

Для сохранения данных необходимо создать объект, заполнить его и обернуть в документ.

#include <QJsonObject>
#include <QJsonDocument>
#include <QFile>
void saveSettings() {
QJsonObject settings;
settings["windowWidth"] = 800;
settings["windowHeight"] = 600;
settings["fontSize"] = 12;
settings["lastFile"] = "C:/Documents/report.txt";
QJsonDocument doc(settings);
QFile file("settings.json");
if (file.open(QIODevice::WriteOnly)) {
file.write(doc.toJson()); // Преобразование в текстовый формат
file.close();
}
}

Процесс восстановления данных требует проверки корректности формата.

void loadSettings() {
QFile file("settings.json");
if (!file.open(QIODevice::ReadOnly)) return;
QByteArray data = file.readAll();
QJsonDocument doc = QJsonDocument::fromJson(data);
if (!doc.isNull() && doc.isObject()) {
QJsonObject settings = doc.object();
int width = settings["windowWidth"].toInt();
int fontSize = settings["fontSize"].toInt(10); // 10 - значение по умолчанию
QString lastFile = settings["lastFile"].toString();
}
file.close();
}

3. Практическое задание

Section titled “3. Практическое задание”

Вам необходимо разработать приложение “Smart Notepad” на базе QMainWindow.

  1. Интерфейс: Использование QTextEdit в качестве центрального виджета.
  2. Файловые операции: Реализовать функции “Открыть” и “Сохранить” для текстовых файлов (.txt).
  3. Работа с JSON:
    • При закрытии программы (событие closeEvent) сохранять в файл config.json:
      • Ширину и высоту окна.
      • Текущий размер шрифта.
      • Путь к последнему открытому/сохраненному файлу.
    • При запуске программы загружать эти данные и применять их к интерфейсу.

4. Пошаговое руководство

Section titled “4. Пошаговое руководство”

Задание №1: Создание проекта и интерфейса

Section titled “Задание №1: Создание проекта и интерфейса”
  • Создайте проект Qt Widgets Application.
  • В MainWindow.ui добавьте QTextEdit.
  • Добавьте меню File с пунктами Open, Save, Exit.

Задание №2: Реализация логики работы с текстом

Section titled “Задание №2: Реализация логики работы с текстом”
  • Используйте QFileDialog::getOpenFileName для выбора файла.
  • Для чтения/записи используйте QFile и QTextStream.

Задание №3: Реализация работы с JSON

Section titled “Задание №3: Реализация работы с JSON”
  • Создайте методы void saveConfig() и void loadConfig().
  • Важно: Для получения размера окна используйте this->size().width() и this->size().height().
  • Для изменения шрифта используйте QFont и метод setFontPointSize() у QTextEdit.

Задание №4: Обработка завершения работы

Section titled “Задание №4: Обработка завершения работы”
  • Переопределите метод closeEvent(QCloseEvent *event) в классе MainWindow, чтобы вызывать saveConfig() перед выходом.

5. Дополнительные задания (на высокую оценку)

Section titled “5. Дополнительные задания (на высокую оценку)”
  1. Список последних файлов: Храните в JSON массив из 5 последних открытых файлов (QJsonArray) и отображайте их в отдельном подменю.
  2. Тема оформления: Добавьте возможность выбора темной/светлой темы и сохраняйте выбор в JSON.
  3. Автосохранение: Реализуйте сохранение текста во временный файл каждые 5 минут (используйте QTimer), путь к которому также хранится в JSON.

  1. В чем разница между QJsonObject и QJsonArray?
  2. Какую роль выполняет класс QJsonDocument в процессе сохранения данных?
  3. Как обработать ситуацию, если JSON-файл поврежден или имеет неверный формат?
  4. Почему для хранения настроек JSON предпочтительнее, чем обычный текстовый файл с произвольной структурой?
  5. Какие типы данных C++ автоматически преобразуются в QJsonValue?