QT 4: программирование GUI на С++
Шрифт:
Функция paginate распределяет элементы справочника цветов по страницам. Ее работа основана на применении функции entryHeight, рассчитывающей
Мы выполняем цикл по элементам и добавляем их в конец текущей страницы до тех пор, пока не окажется, что элемент не вмещается на страницу; затем мы добавляем текущую страницу в конец списка pages и начинаем формировать новую страницу.
Функция entryHeight использует QPainter::boundingRect для вычисления размера области, занимаемой одним элементом по вертикали. На рис. 8.14 показана компоновка элементов одного цветка на странице и проиллюстрирован смысл констант SmallGap и MediumGap.
< image l:href="#"/>Рис. 8.14. Компоновка элементов справочника цветов на странице.
Функция 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 для распечатки каждой страницы.
Функция printPage обрабатывает в цикле все элементы справочника цветов и печатает их при помощи двух вызовов функции printBox: один для заголовка (название цветка) и другой для «тела» (описание цветка). Она также отображает номер страницы внизу по центру страницы.