Практическая работа №19. Работа с JSON в Qt
Цель работы
Section titled “Цель работы”- Изучить формат JSON и его применение в C++ приложениях на базе фреймворка Qt.
- Познакомиться с основными классами для работы с JSON:
QJsonObject,QJsonArray,QJsonDocument. - Научиться реализовывать механизмы сохранения и загрузки настроек приложения (сериализация и десериализация).
- Разработать текстовый редактор с функционалом запоминания состояния интерфейса.
1. Теоретические сведения
Section titled “1. Теоретические сведения”1.1 Что такое JSON
Section titled “1.1 Что такое JSON”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. Основные классы:
QJsonValue: Инкапсулирует любое значение JSON (строку, число, объект и т.д.).QJsonObject: Представляет собой ассоциативный массив (объект JSON). Ключи всегда являются строками.QJsonArray: Представляет собой список значений (массив JSON).QJsonDocument: Позволяет преобразовывать JSON-структуры в текстовое (UTF-8) или бинарное представление и обратно.
2. Примеры реализации на C++
Section titled “2. Примеры реализации на C++”2.1 Запись данных в JSON
Section titled “2.1 Запись данных в JSON”Для сохранения данных необходимо создать объект, заполнить его и обернуть в документ.
#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(); }}2.2 Чтение данных из JSON
Section titled “2.2 Чтение данных из JSON”Процесс восстановления данных требует проверки корректности формата.
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.
Основные требования:
Section titled “Основные требования:”- Интерфейс: Использование
QTextEditв качестве центрального виджета. - Файловые операции: Реализовать функции “Открыть” и “Сохранить” для текстовых файлов (
.txt). - Работа с 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. Дополнительные задания (на высокую оценку)”- Список последних файлов: Храните в JSON массив из 5 последних открытых файлов (
QJsonArray) и отображайте их в отдельном подменю. - Тема оформления: Добавьте возможность выбора темной/светлой темы и сохраняйте выбор в JSON.
- Автосохранение: Реализуйте сохранение текста во временный файл каждые 5 минут (используйте
QTimer), путь к которому также хранится в JSON.
6. Контрольные вопросы
Section titled “6. Контрольные вопросы”- В чем разница между
QJsonObjectиQJsonArray? - Какую роль выполняет класс
QJsonDocumentв процессе сохранения данных? - Как обработать ситуацию, если JSON-файл поврежден или имеет неверный формат?
- Почему для хранения настроек JSON предпочтительнее, чем обычный текстовый файл с произвольной структурой?
- Какие типы данных C++ автоматически преобразуются в
QJsonValue?