QT 4: программирование GUI на С++
Шрифт:
Этот подход дает одинаково высококачественный результат на всех платформах, за исключением воспроизведения шрифта, что зависит от установленных в системе шрифтов.
Особенно эффективным средством графического процессора Qt является его поддержка режимов композиции. Эти режимы определяют способ слияния исходного и нового пикселя при рисовании. Это относится ко всем операциям рисования, в том числе относящимся к перу, кисти, градиенту и изображению.
Режимом композиции по умолчанию является QImage::CompositionMode_SourceOver, означающий, что исходный пиксель (тот, который рисуется в данный момент) налагается поверх существующего
Рис. 8.11. Режимы композиции QPainter.
Режимы композиции устанавливаются функцией QPainter::setCompositionMode. Например, ниже показано, как можно создать объект QImage, объединяющий пиксели бабочки и тестового шаблона с помощью операции XOR:
Следует иметь в виду, что операция QImage::CompositionMode_Xor применяется к альфа—компоненту. Это означает, что если мы применим операцию XOR при наложении белого цвета (0xFFFFFFFF) на белый цвет, мы получим прозрачный цвет (0х00000000), а не черный цвет(0хFF000000).
Вывод на печатающее устройство
Вывод на печатающее устройство в Qt подобен рисованию по QWidget, QPixmap или QImage. Порядок действий при этом будет следующим:
1. Создайте в качестве устройства рисования объект QPrinter.
2. Выведите на экран диалоговое окно печати QPrintDialog, позволяя пользователю выбрать печатающее устройство и установить некоторые параметры печати.
3. Создайте объект QPainter для работы с QPrinter.
4. Нарисуйте страницу, используя QPainter.
5. Вызовите функцию QPrinter::newPage для перехода на следующую страницу.
6. Повторяйте пункты 4 и 5 до тех пор, пока не будут распечатаны все страницы.
В операционных системах Windows и Mac OS X QPrinter использует системные драйверы принтеров. В системе Unix он формирует файл PostScript и передает его lp или lpr (или другой программе, установленной функцией QPrinter::setPrintProgram). QPrinter может также использоваться для генерации файлов PDF, если вызвать setOutputFormat(QPrinter::PdfFormat).
Давайте начнем с рассмотрения какого-нибудь простого примера по распечатке одной страницы. Первый пример
Рис. 8.12. Вывод на печатающее устройство объекта QImage.
Мы предполагаем, что класс PrintWindow имеет переменную—член printer типа QPrinter. Мы могли бы просто поместить QPrinter в стек в функции printImage, но тогда не сохранялись бы настройки пользователя при переходе от одной печати к другой.
Мы создаем объект QPrintDialog и вызываем функцию exec для вывода на экран диалогового окна печати. Оно возвращает true, если пользователь нажал кнопку OK; в противном случае оно возвращает false. После вызова функции exec объект QPrinter готов для использования. (Можно также печатать, не используя QPrintDialog, а напрямую вызывая функции—члены класса QPrinter для подготовки печати.)
Затем мы создаем QPainter для рисования на QPrinter. Мы устанавливаем окно на прямоугольник изображения и область отображения на прямоугольник с тем же соотношением сторон, и мы рисуем изображение в позиции (0, 0).
По умолчанию окно QPrinter инициализируется таким образом, что разрешающая способность принтера будет аналогична разрешающей способности экрана (обычно она составляет примерно от 72 до 100 точек на дюйм), позволяя легко использовать для печати программный код по рисованию виджета. Здесь это не имеет значения, поскольку мы сами задали параметры нашего окна.
Вывод на печатающее устройство элементов, занимающих не более одной страницы, выполняется достаточно просто, но во многих приложениях приходится печатать несколько страниц. В таких случаях мы должны сначала нарисовать одну страницу и затем вызвать функцию newPage для перехода на следующую страницу. Здесь возникает проблема определения того количества информации, которое будет печататься на одной странице. Существует два подхода при обработке многостраничных документов в Qt: