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

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.

Мы начинаем с определения диапазона печати. Функции QPrinter fromPage и toPage возвращают заданные пользователем номера страниц или 0, если диапазон не указан. Мы вычитаем 1, потому что наш список страниц pages нумеруется с нуля, и устанавливаем переменные firstPage и lastPage (первая и последняя страницы) на охват всех страниц, если диапазон не задан пользователем.

Затем мы печатаем каждую страницу. Внешний цикл for определяется количеством копий, запрошенных пользователем. Большинство драйверов принтеров поддерживают печать нескольких копий, поэтому для них функция QPrinter::numCopies всегда возвращает 1. Если драйвер принтера не может печатать несколько копий, numCopies возвращает количество копий, запрошенное пользователем, и за печать этого количества копий отвечает приложение. (В примере с QImage, приведенном ранее в данном разделе, мы для простоты проигнорировали numCopies.)

Рис. 8.15 аналогичен 8.13.

Внутренний цикл for выполняется по всем страницам. Если страница не первая, мы вызываем newPage, чтобы сбросить на печатающее устройство старую страницу и начать рисование новой страницы. Мы вызываем printPage для распечатки каждой страницы.

01 void PrintWindow::printPage(QPainter *painter,

02 const QStringList &entries, int pageNumber)

03 {

04 painter->save;

05 painter->translate(0, LargeGap);

06 foreach (QString entry, entries) {

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

08 QString title = fields[0];

09 QString body = fields[1];

10 printBox(painter, title, titleFont, Qt::lightGray);

11 printBox(painter, body, bodyFont, Qt::white);

12 painter->translate(0, MediumGap);

13 }

14 painter->restore;

15 painter->setFont(footerFont);

16 painter->drawText(painter->window,

17 Qt::AlignHCenter | Qt::AlignBottom,

18 QString::number(pageNumber));

19 }

Функция printPage обрабатывает в цикле все элементы справочника цветов и печатает их при помощи двух вызовов функции printBox: один для заголовка (название цветка) и другой для «тела» (описание цветка). Она также отображает номер страницы внизу по центру страницы.

01 void PrintWindow::printBox(QPainter *painter, const QString &str,

02 const QFont &font, const QBrush &brush)

03 {

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