134 lines
5.8 KiB
Markdown
134 lines
5.8 KiB
Markdown
# DocxWizard — Модуль пошагового создания Word-документов
|
||
|
||
## Стек технологий
|
||
|
||
| Компонент | Инструмент | Зачем |
|
||
|--------------------|-------------------------------|---------------------------------------------|
|
||
| Язык | C++17 | Основной язык проекта |
|
||
| GUI + логика | Qt5 (Widgets) | Уже используется в проекте |
|
||
| Генерация DOCX | Qt5 (QZipWriter) или QuaZip | DOCX — это ZIP+XML; Qt умеет это нативно |
|
||
| Изображения | Qt5 QFile | Чтение и вставка бинарных данных изображений |
|
||
|
||
**Внешних зависимостей нет** (кроме Qt5, которая уже есть).
|
||
|
||
---
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
main.cpp
|
||
└── MainWindow ← Главное окно; редактор строк-шаблонов
|
||
└── DocumentWizard ← Пошаговый диалог (QDialog)
|
||
├── parseTemplates() ← Читает строки шаблона → список шагов
|
||
├── showStep() ← Показывает нужный UI для шага
|
||
├── applyCurrentStep() ← Передаёт данные в DocxBuilder
|
||
└── DocxBuilder ← Генерирует .docx файл
|
||
├── addHeading()
|
||
├── addParagraph()
|
||
├── addTable()
|
||
├── addImage()
|
||
└── save() ← Записывает ZIP/XML в файл
|
||
```
|
||
|
||
---
|
||
|
||
## Формат строк шаблона
|
||
|
||
Строки шаблона «скармливаются» программе в начале работы.
|
||
Каждая строка задаёт один шаг мастера:
|
||
|
||
```
|
||
тип|Подсказка для пользователя|Вариант1;Вариант2;Вариант3
|
||
```
|
||
|
||
### Типы элементов
|
||
|
||
| Тип | Результат в документе | Примечание |
|
||
|----------|-------------------------------|--------------------------------------|
|
||
| heading1 | Заголовок 1 (18pt, жирный) | Times New Roman |
|
||
| heading2 | Заголовок 2 (15pt, жирный) | Times New Roman |
|
||
| heading3 | Заголовок 3 (13pt, жирный) | Times New Roman |
|
||
| text | Обычный абзац (12pt) | Times New Roman |
|
||
| table | Таблица с заголовками | UI для ввода строк |
|
||
| image | Встроенное изображение | PNG/JPG, размер в см |
|
||
|
||
### Пример шаблона
|
||
|
||
```
|
||
heading1|Введите название документа|Технический отчёт;Пояснительная записка
|
||
heading2|Название раздела «Введение»|1. Введение;1. Общие сведения
|
||
text|Напишите вводный абзац|Настоящий документ описывает…;В данной работе…
|
||
table|Заполните таблицу характеристик|
|
||
image|Вставьте схему архитектуры|
|
||
heading2|Заключение|4. Заключение;4. Выводы
|
||
text|Напишите заключение|В результате работы…;Таким образом…
|
||
```
|
||
|
||
---
|
||
|
||
## Сборка
|
||
|
||
```bash
|
||
cd docx_module
|
||
qmake DocxWizard.pro
|
||
make # Linux/macOS
|
||
# или
|
||
nmake # Windows (MSVC)
|
||
```
|
||
|
||
### Альтернатива QZipWriter → QuaZip
|
||
|
||
Если Qt5 собрана без приватных заголовков (`-private`):
|
||
|
||
```bash
|
||
# Ubuntu/Debian
|
||
sudo apt install libquazip5-dev
|
||
|
||
# или vcpkg
|
||
vcpkg install quazip
|
||
```
|
||
|
||
Затем в `DocxBuilder.cpp` замените:
|
||
```cpp
|
||
// Было:
|
||
#include <QtCore/private/qzipwriter_p.h>
|
||
|
||
// Стало:
|
||
#include <quazip/quazip.h>
|
||
#include <quazip/quazipfile.h>
|
||
```
|
||
|
||
И адаптируйте метод `DocxBuilder::save()` — используйте `QuaZip` + `QuaZipFile`
|
||
вместо `QZipWriter`. API очень похожи.
|
||
|
||
---
|
||
|
||
## Интеграция в существующий Qt5 проект
|
||
|
||
1. Скопируйте `DocxBuilder.h/.cpp` и `DocumentWizard.h/.cpp` в свой проект.
|
||
2. В `.pro` добавьте:
|
||
```
|
||
QT += core-private # для QZipWriter
|
||
SOURCES += DocxBuilder.cpp DocumentWizard.cpp
|
||
HEADERS += DocxBuilder.h DocumentWizard.h
|
||
```
|
||
3. Используйте из кода:
|
||
```cpp
|
||
QStringList tmpl = loadTemplateFromFile("template.txt");
|
||
DocumentWizard dlg(tmpl, this);
|
||
if (dlg.exec() == QDialog::Accepted)
|
||
qDebug() << "Сохранено:" << dlg.outputFilePath();
|
||
```
|
||
|
||
---
|
||
|
||
## Расширение функциональности
|
||
|
||
| Задача | Куда добавить |
|
||
|--------------------------------|------------------------------------------|
|
||
| Нумерованные списки | `DocxBuilder::addList()` |
|
||
| Верхний/нижний колонтитул | `DocxBuilder::buildDocumentXml()` — `<w:sectPr>` |
|
||
| Оглавление | XML-элемент `<w:fldChar>` с `TOC` |
|
||
| Сохранение шаблона в файл | `QSettings` или простой `.txt` |
|
||
| Предпросмотр документа | LibreOffice → конвертировать в PDF → показать |
|