Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

• Мы можем преобразовать наши данные в формат HTML и затем воспроизвести их с применением класса QTextDocument, процессора форматированного текста Qt.

• Мы можем выполнить рисование и разбивку на страницы вручную.

Мы рассмотрим по очереди оба подхода. В качестве примера мы распечатаем цветочный справочник: список названий цветов с текстовым описанием. Каждый элемент этого справочника представляется строкой формата «название: описание», например:

Miltonopsis santanae: Самый опасный вид орхидеи.

Поскольку данные каждого цветка представлены одной строкой, мы можем представить цветочный справочник при помощи

одного объекта QStringList. Ниже приводится функция печати цветочного справочника, использующая процессор форматированного текста Qt:

01 void PrintWindow::printFlowerGuide(const QStringList &entries)

02 {

03 QString html;

04 foreach(QString entry, entries) {

05 QStringList fields = entry.split(": ");

06 QString title = Qt::escape(fields[0]);

07 QString body = Qt::escape(fields[1]);

08 html = "<table width=\"100%\" border=1 cellspacing=0>\n"

09 "<tr><td bgcolor=\"lightgray\"><font size=\"+1\">"

10 "<b><i>" + title + "</i></b></font>\n<tr><td>" + body"

11 + "\n</table>\n<br>\n";

12 }

13 printHtml(html);

14 }

На первом этапе QStringList преобразуется в формат HTML. Каждый цветок представляется таблицей HTML с двумя ячейками. Мы используем функцию Qt::escape для замены специальных символов «&», «<», «>» на соответствующие элементы формата HTML(«&amp;», «&lt;», «&gt;»). Затем мы вызываем функцию printHtml для печати текста.

01 void PrintWindow::printHtml(const QString &html)

02 {

03 QPrintDialog printDialog(&printer, this);

04 if (printDialog.exec) {

05 QPainter painter(&printer);

06 QTextDocument textDocument;

07 textDocument.setHtml(html);

08 textDocument.print(&printer);

09 }

10 }

Функция printHtml выводит диалоговое окно QPrintDialog и выполняет печать документа HTML. Она может без изменений повторно использоваться в любом приложении Qt для распечатки страниц произвольного текста в формате HTML.

Рис. 8.13. Вывод на печать цветочного справочника с применением QTextDocument.

Преобразование документа в формат HTML и использование QTextDocument для его распечатки являются самым удобным способом печати отчетов и других сложных документов. В тех случаях, когда требуется обеспечить больший контроль, мы можем вручную выполнить компоновку страниц и их рисование. Давайте теперь посмотрим, как можно напечатать цветочный справочник при помощи класса QPainter.

Ниже приводится новая версия функции printFlowerGuide:

01 void PrintWindow::printFlowerGuide(const QStringList &entries)

02 {

03 QPrintDialog printDialog(&printer, this);

04 if (printDialog.exec) {

05 QPainter painter(&printer);

06 QList<QStringList> pages;

07 paginate(&painter, &pages, entries);

08 printPages(&painter, pages);

09 }

10 }

После настройки принтера и построения объекта рисовальщика мы вызываем вспомогательную функцию paginate для определения содержимого каждой страницы. В результате получается вектор списков QStringList, причем каждый список QStringList содержит элементы одной страницы. Результат мы передаем функции printPages.

Например, предположим, что цветочный справочник содержит всего 6 элементов, которые мы обозначим буквами А, Б, В, Г, Д и E. Теперь предположим, что имеется достаточно места для элементов А и Б на первой странице, В, Г и Д на второй странице и Е на третьей странице. Тогда список pages содержал бы список [А, Б] в элементе с индексом 0, список [В, Г, Д] в элементе с индексом 1 и список [E] в элементе с индексом 2.

01 void PrintWindow::paginate(QPainter *painter, QList<QStringList> *pages,

02 const QStringList &entries)

03 {

04 QStringList currentPage;

05 int pageHeight = painter->window.height - 2 * LargeGap;

06 int у = 0;

07 foreach (QString entry, entries) {

08 int height = entryHeight(painter, entry);

09 if (у + height > pageHeight && !currentPage.empty) {

10 pages->append(currentPage);

11 currentPage.clear;

12 y = 0;

13 }

14 currentPage.append(entry);

15 у += height + MediumGap;

16 }

17 if (!currentPage.empty)

18 pages->append(currentPage);

19 }

Функция paginate распределяет элементы справочника цветов по страницам. Ее работа основана на применении функции entryHeight, рассчитывающей высоту каждого элемента. Она также учитывает наличие сверху и снизу страницы полей с размером LargeGap.

Поделиться:
Популярные книги

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Последнее небо

Игнатова Наталья Владимировна
1. Зверь
Фантастика:
боевая фантастика
6.81
рейтинг книги
Последнее небо

На границе империй. Том 10. Часть 8

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 8

Четники. Королевская армия

Тимофеев Алексей Юрьевич
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Четники. Королевская армия

Второгодка. Книга 5. Презренный металл

Ромов Дмитрий
5. Второгодка
Фантастика:
городское фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Второгодка. Книга 5. Презренный металл

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Товарищ "Чума" 2

lanpirot
2. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 2

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Древесный маг Орловского княжества 6

Павлов Игорь Васильевич
6. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 6

Я – Стрела. Трилогия

Суббота Светлана
Я - Стрела
Любовные романы:
любовно-фантастические романы
эро литература
6.82
рейтинг книги
Я – Стрела. Трилогия

Неучтенный элемент. Том 1

NikL
1. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 1

Второй кощей

Билик Дмитрий Александрович
8. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
5.00
рейтинг книги
Второй кощей

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Инженер Петра Великого 4

Гросов Виктор
4. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Инженер Петра Великого 4