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 → показать |
|