Система рисования
Система рисования Qt позволяет рисовать на экране и печатающих устройствах используя один и тот же API, и основана, в основном, на классах QPainter, QPaintDevice и QPaintEngine. QPainter используется для выполнения операций рисования, QPaintDevice - абстракция двухмерного пространства, на котором можно рисовать используя QPainter, а QPaintEngine предоставляет интерфейс, который рисовальщик использует для рисования на различных типах устройств. Класс QPaintEngine используется для внутренних нужд в QPainter и QPaintDevice, и невидим для программистов приложений если только они не создадут свой собственный тип устройства. Главное достоинство такого подхода заключается в том, что все рисование выполняется одним и тем же конвейером рисования, облегчая добавление поддержки новых возможностей и предоставляя реализации по умолчанию для неподдерживаемых возможностей. В качестве альтернативы, Qt предоставляет модуль QtOpenGL, предлагающий классы, которые делают более легким использование OpenGL в приложениях Qt. Помимо прочего, модуль предоставляет класс виджета OpenGL, который может использоваться также как и любой другой виджет Qt, за исключением того что он открывает дисплейный буфер OpenGL, где может быть использовано OpenGL API для формирования изображения содержимого.
РисованиеQPainter предоставляет тщательно оптимизированные функции для выполнения большей части рисования, необходимого программам с ГПИ. Он может нарисовать всё, начиная с простых графических примитивов (представляемых классами QPoint, QLine, QRect, QRegion и QPolygon) и заканчивая сложными фигурами, например, векторными траекториями. В Qt векторные траектории представлены классом QPainterPath. QPainterPath предоставляет контейнер для операций рисования, позволяющий создавать и повторно использовать графические фигуры.
Линии и контуры рисуются используя класс QPen. Перо определяется своим стилем (т.е. своим типом линии, line-type), шириной, кистью, способом рисования точек окончания (стилем окончаний, cap-style) и как рисуется место соединения двух соединенных линий (стиль объединения, join-style). Кистью пера является объект QBrush, используемый для заполнения штрихов, создаваемых пером, т.е. класс QBrush определяет узор-заполнитель (fill pattern). QPainter также может рисовать выровненный текст и растровые изображения. При отрисовке текста шрифт задается используя класс QFont. Qt будет использовать шрифт с заданными атрибутами или, если нет соответствующего шрифта, то Qt будет использовать наиболее похожий установленный шрифт. Атрибуты шрифта, которые действительно используются, можно получить используя класс QFontInfo. Кроме того, класс QFontMetrics предоставляет размеры шрифта, а класс QFontDatabase предоставляет информацию о шрифтах, доступных в основной оконной системе. Обычно QPainter рисует в "естественной" системе координат, но может выполнять преобразование вида и мировое преобразование, используя класс QMatrix. Для получения дополнительной информации смотрите документацию Система координат, которая также описывает процесс визуализации, т.е. соотношение между логическим представлением и визуализируемыми пикселями, а также преимущества сглаженного рисования.
ЗаливкаФигуры заполняются с использованием класса QBrush. Кисть определяется своим цветом и стилем (т.е. своим узором-заполнителем). Все цвета в Qt представляются классом QColor, который поддерживает цветовые модели RGB, HSV и CMYK. QColor также поддерживает альфа-смешивание контуров и внутренних областей (задавая эффект прозрачности), а класс является независимым от платформы и устройства (цвета отображаются на аппаратное обеспечение с использованием класса QColormap). Для получения дополнительной информации смотрите документацию класса QColor. При создании нового виджета рекомендуется использовать цвета палитры виджета вместо жестко запрограммированных конкретных цветов. Все виджеты в Qt содержат палитру и используют свою палитру для отрисовки самих себя. Палитра виджета представляется классом QPalette, который содержит группы цветов для каждого состояния виджета. Доступные узоры-заполнители описываются перечислением Qt::BrushStyle. Оно включает базовые шаблоны, простирающиеся от равномерного цвета до очень разреженного шаблона, различные комбинации линий, градиентные заливки и текстуры. Qt предоставляет класс QGradient для определения пользовательских градиентных заливок, в то время как текстурные шаблоны задаются используя класс QPixmap.
Создание устройства рисованияКласс QPaintDevice является базовым для объектов, на которых можно рисовать, т.е. QPainter может рисовать на любых подклассах QPaintDevice. Возможности рисования на QPaintDevice'е в настоящее время реализованы подклассами QWidget, QImage, QPixmap, QGLWidget, QGLPixelBuffer, QPicture и QPrinter.
ВиджетКласс QWidget является базовым классом для всех объектов пользовательского интерфейса. Виджет - это элементарный объект пользовательского интерфейса: он получает события мыши, клавиатуры и другие события от оконной системы и рисует свое изображение на экране. ИзображениеКласс QImage предоставляет аппаратно-независимое представление изображения, которое спроектировано и оптимизировано для ввода/вывода и для непосредственного доступа к пикселям и манипуляций с ними. QImage поддерживает несколько форматов изображений, включая монохромное, 8-битное, 32-битное и изображения с альфа-смешиванием. Одним из преимуществ использования QImage в качестве устройства рисования является возможность гарантировать пиксельную точность любой операции рисования независимым от платформы способом. Другим преимуществом является то, что рисование может выполняться в другом потоке, а не в текущем потоке ГПИ. Растровое изображениеКласс QPixmap является внеэкранным представлением изображения, которое спроектировано и оптимизировано для показа изображений на экране. В отличие от QImage, данные о пикселах в растровом изображении являются внутренними и управляются основной оконной системой, т.е. доступ к пикселям может быть осуществлен только через функции QPainter'а или после преобразования QPixmap в QImage. Чтобы оптимизировать рисование с помощью QPixmap, Qt предоставляет класс QPixmapCache, который можно использовать для сохранения временных растровых изображений, которые дорого генерировать без использования области памяти, превышающей предельный размер кэша. Qt также предоставляет вспомогательный класс QBitmap, унаследованный от QPixmap. QBitmap обеспечивает монохромные (глубиной в 1 бит) растровые изображения и используется главным образом для создания пользовательских объектов QCursor и QBrush, создания объектов QRegion, а также для установки масок для растровых изображений и виджетов. Виджет OpenGLКак было сказано выше, Qt предоставляет модуль QtOpenGL, предлагающий классы, которые упрощают использование OpenGL в приложениях Qt. Например, QGLWidget разрешает OpenGL API для визуализации. Однако QGLWidget также является подклассом QWidget и может быть использован QPainter'ом как любое другое устройство рисования. Одним из преимуществ является то, что это позволяет Qt использовать высокую производительность OpenGL для большинства операций рисования, таких как преобразования и рисование растровых изображений. Пиксельный буферМодуль QtOpenGL также предоставляет класс QGLPixelBuffer, который является прямым наследником QPaintDevice. QGLPixelBuffer инкапсулирует пиксельный буфер OpenGL, pbuffer. Визуализация в pbuffer обычно производится с использованием полного аппаратного ускорения, что может быть значительно быстрее чем визуализация в QPixmap. Framebuffer ObjectМодуль QtOpenGL также предоставляет класс QGLFramebufferObject, который является прямым наследником QPaintDevice. QGLFramebufferObject инкапсулирует объект буфера кадров OpenGL. Объекты буфера кадров можно также использовать для внеэкранной визуализации, и дает некоторые преимущества перед использованием пиксельных буферов для этой цели. Они описаны в документации класса QGLFramebufferObject. ИзображениеКласс QPicture - устройство рисования, которое записывает и воспроизводит команды QPainter'а. Изображение преобразовывает команды рисовальщика для устройства ввода-вывода в последовательную форму в платформонезависимом формате. QPicture также не зависит от разрешающей способности, т.е. QPicture может отображаться на разных устройствах (например, svg, pdf, ps, принтере и экране), имея при этом один и тот же внешний вид. Qt предоставляет функции QPicture::load() и QPicture::save() для загрузки и сохранения изображений. Но кроме того класс QPictureIO предоставляется чтобы дать возможность программисту устанавливать новые форматы изображений помимо тех, что предоставляет Qt. ПринтерКласс QPrinter - устройство рисования, которое рисует на принтер. В Windows или Mac OS X QPrinter использует встроенные драйвера принтера. В X11 QPrinter генерирует postscript и отправляет его в lpr, lp или другую программу печати. QPrinter может также печатать на любой другой объект QPrintEngine. Класс QPrintEngine определяет интерфейс, через который QPrinter взаимодействует с имеющейся подсистемой печати. В общем случае, когда создается собственный механизм печати, он наследуется и от QPaintEngine и от QPrintEngine. Формат вывода по умолчанию зависит от платформы, на которой работает принтер, но явно настроив формат вывода для QPrinter::PdfFormat, QPrinter будет генерировать свой вывод в виде PDF-файла. Чтение и запись файлов изображенийНаиболее распространенный способ чтения изображений - посредством конструкторов QImage и QPixmap, или вызова функций QImage::load() и QPixmap::load(). Кроме того, Qt предоставляет класс QImageReader, который дает больший контроль за процессом. В зависимости от базовой поддержки в формате изображения, функции предоставляемые классом могут сохранять память и ускорить загрузку изображений. Также Qt предоставляет класс QImageWriter, который поддерживает установку опций, специфичных для формата, например, гамма-уровень, уровень сжатия и качество, перед сохранением изображения. Если вам не нужны такие опции, используйте взамен QImage::save() или QPixmap::save().
Классы QImageReader и QImageWriter зависят от класса QImageIOHandler, который является общим интерфейсом ввода/вывода изображения для всех форматов изображений в Qt. Объекты QImageIOHandler используются для внутренних нужд в QImageReader и QImageWriter для добавления в Qt поддержки различных форматов изображения. Список поддерживаемых форматов файлов доступен посредством функций QImageReader::supportedImageFormats() и QImageWriter::supportedImageFormats(). Qt поддерживает несколько форматов файлов по умолчанию, а кроме того новые форматы могут быть добавлены в качестве подключаемых модулей. Поддерживаемые в настоящее время форматы перечислены в документации классов QImageReader и QImageWriter. Механизм подключаемых модулей Qt может также использоваться для написания обработчиков пользовательских форматов изображения. Это делается наследованием от класса QImageIOHandler и созданием объекта QImageIOPlugin, который является фабрикой для создания объектов QImageIOHandler. Когда подключаемый модуль установлен, QImageReader и QImageWriter автоматически загрузят его и начнут его использовать.
Применение стилейВстроенные виджеты Qt используют класс QStyle для выполнения почти всех своих операций рисования. QStyle - абстрактный базовый класс, который инкапсулирует внешний вид и поведение ГПИ, и может использоваться чтобы заставить виджеты выглядеть точно также как "родные" эквивалентные виджеты или чтобы придать виджетам пользовательский внешний вид. Qt предоставляет набор подклассов QStyle , которые эмулируют внешний вид, присущий различным платформам, поддерживаемых Qt (QWindowsStyle, QMacStyle, QMotifStyle и т.д.). Эти стили встроены в библиотеку QtGui, остальные же стили можно сделать доступными используя механизм подключаемых модулей Qt. Большинство функций для отрисовки элементов стиля получают четыре аргумента:
Стиль получает всю информацию, необходимую для визуализации графического элемента, из класса QStyleOption. Виджет передается в последнем аргументе в том случае, если стиль нуждается в нем для создания специальных эффектов (таких как анимированные кнопки по умолчанию в Mac OS X), но это не обязательно. Фактически, QStyle может использоваться для рисования на любом устройстве рисования (не только виджетах), в этом случае аргумент виджета равен нулевому указателю (zero pointer). Система рисования также предоставляет класс QStylePainter, унаследованный от QPainter. QStylePainter - вспомогательный класс для отрисовки элементов QStyle внутри виджета, а также расширяет QPainter с помощью набора высокоуровневых функций рисования, реализованных поверх API QStyle'а. Преимущество от использования QStylePainter заключается в том, что списки получаемых параметров значительно короче.
|
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |