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;

09 int lastPage = printer.toPage() - 1;

10 if (lastPage == -1 || lastPage >= pages.size())

11 lastPage = pages.size() - 1;

12 int numPages = lastPage - firstPage + 1;

13 for (int i = 0; i < printer.numCopies(); ++i) {

14 for (int j = 0; j < numPages; ++j) {

15 if (i != 0 || j != 0)

16 printer.newPage();

17 int index;

18 if (printer.pageOrder() == QPrinter::FirstPageFirst) {

19 index = firstPage + j;

20 } else {

21 index = lastPage - j;

22 }

23 printPage(painter, pages[index], index + 1);

24 }

25 }

26 }

Функция printPages() предназначена для печати каждой страницы функцией printPage() с обеспечением правильного числа и правильной последовательности вызовов последней. Применяя QPrintDialog, пользователь может запросить распечатку нескольких копий, указать диапазон страниц или запросить распечатку страниц в обратной последовательности. Мы сами должны включать или отключать эти опции, используя функцию QPrintDialog::setEnabledOptions().

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

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