07 paginate(&painter, &pages, entries);
08 printPages(&painter, pages);
09 }
10 }
После настройки принтера и построения объекта рисовальщика мы вызываем вспомогательную функцию
Например, предположим, что цветочный справочник содержит всего 6 элементов, которые мы обозначим буквами
01 void PrintWindow::paginate(QPainter *painter, QList
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 }
Функция
Мы выполняем цикл по элементам и добавляем их в конец текущей страницы до тех пор, пока не окажется, что элемент не вмещается на страницу; затем мы добавляем текущую страницу в конец списка
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 }
Функция
01 void PrintWindow::printPages(QPainter *painter,
02 const QList
03 {
04 int firstPage = printer.fromPage - 1;
05 if (firstPage >= pages.size)
06 return;
07 if (firstPage == -1)
08 firstPage = 0;