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

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

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

08 html = "

\n"

09 ""

10 "" + title + "\n" + body"

11 + "\n\n
\n";

12 }

13 printHtml(html);

14 }

На первом этапе QStringList преобразуется в формат HTML. Каждый цветок представляется таблицей HTML с двумя ячейками. Мы используем функцию Qt::escape() для замены специальных символов «&», «<», «>» на соответствующие элементы формата HTML(«&», «<», «>»). Затем мы вызываем функцию 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 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 *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 }

Перейти на страницу:

Похожие книги