Читаем QT 4: программирование GUI на С++ полностью

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 }

17 if (!currentPage.empty)

18 pages->append(currentPage);

19 }

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

Мы выполняем цикл по элементам и добавляем их в конец текущей страницы до тех пор, пока не окажется, что элемент не вмещается на страницу; затем мы добавляем текущую страницу в конец списка pages и начинаем формировать новую страницу.

01 int PrintWindow::entryHeight(QPainter *painter, const QString &entry)

02 {

03 int textWidth = painter->window.width - 2 * SmallGap;

04 QString title = fields[0];

05 QString body = fields[1];

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

07 int maxHeight = painter->window.height;

08 painter->setFont(titleFont);

09 QRect titleRect = painter->boundingRect(0, 0, textWidth, maxHeight,

10 Qt::TextWordWrap, title);

11 painter->setFont(bodyFont);

12 QRect bodyRect = painter->boundingRect(0, 0, textWidth, maxHeight,

13 Qt::TextWordWrap, body);

14 return titleRect.height + bodyRect.height + 4 * SmallGap;

15 }

Функция entryHeight использует QPainter::boundingRect для вычисления размера области, занимаемой одним элементом по вертикали. На рис. 8.14 показана компоновка элементов одного цветка на странице и проиллюстрирован смысл констант SmallGap и MediumGap.

Рис. 8.14. Компоновка элементов справочника цветов на странице.

01 void PrintWindow::printPages(QPainter *painter,

02 const QList &pages)

03 {

04 int firstPage = printer.fromPage - 1;

05 if (firstPage >= pages.size)

06 return;

07 if (firstPage == -1)

08 firstPage = 0;

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже