QT 4: программирование GUI на С++
вернуться

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

Шрифт:

Мы выполняем цикл по элементам и добавляем их в конец текущей страницы до тех пор, пока не окажется, что элемент не вмещается на страницу; затем мы добавляем текущую страницу в конец списка 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.

< image l:href="#"/>

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

01 void PrintWindow::printPages(QPainter *painter,

02 const QList<QStringList> &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.

Мы начинаем с определения диапазона печати. Функции 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)

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

Private-Bookers - русскоязычная библиотека для чтения онлайн. Здесь удобно открывать книги с телефона и ПК, возвращаться к сохраненной странице и держать любимые произведения под рукой. Материалы добавляются пользователями; если считаете, что ваши права нарушены, воспользуйтесь формой обратной связи.

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

  • Моя полка

Контакты

  • help@private-bookers.win