Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

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

Шрифт:

Этот подход дает одинаково высококачественный результат на всех платформах, за исключением воспроизведения шрифта, что зависит от установленных в системе шрифтов.

Особенно эффективным средством графического процессора Qt является его поддержка режимов композиции. Эти режимы определяют способ слияния исходного и нового пикселя при рисовании. Это относится ко всем операциям рисования, в том числе относящимся к перу, кисти, градиенту и изображению.

Режимом композиции по умолчанию является QImage::CompositionMode_SourceOver, означающий, что исходный пиксель (тот, который рисуется в данный момент) налагается поверх существующего

на изображении пикселя, причем альфа—компонент исходного пикселя определяет степень его прозрачности. На рис. 8.11 показан результат рисования полупрозрачной бабочки поверх тестового шаблона при использовании разных режимов.

Рис. 8.11. Режимы композиции QPainter.

Режимы композиции устанавливаются функцией QPainter::setCompositionMode. Например, ниже показано, как можно создать объект QImage, объединяющий пиксели бабочки и тестового шаблона с помощью операции XOR:

QImage resultImage = checkerPatternImage;

QPainter painter(&resultImage);

painter.setCompositionMode(QPainter::CompositionMode_Xor);

painter.drawImage(0, 0, butterflyImage);

Следует иметь в виду, что операция 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).

Давайте начнем с рассмотрения какого-нибудь простого примера по распечатке одной страницы. Первый пример

распечатывает объект QImage:

01 void PrintWindow::printImage(const Qlmage &image)

02 {

03 QPrintDialog printDialog(&printer, this);

04 if (printDialog.exec) {

05 QPainter painter(&printer);

06 QRect rect = painter.viewport;

07 QSize size = image.size;

08 size.scale(rect.size, Qt::KeepAspectRatio);

09 painter.setViewport(rect.x. rect.y, size.width, size.height);

10 painter.setWindow (image.rect);

11 painter.drawImage(0, 0, image);

12 }

13 }

Рис. 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:

Поделиться:
Популярные книги

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Честное пионерское! Часть 3

Федин Андрей Анатольевич
3. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Честное пионерское! Часть 3

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Совершенный: охота

Vector
3. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Совершенный: охота

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник