Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

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

Шрифт:

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.

  • Читать дальше
  • 1
  • ...
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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