На этом шаге рассмотрим использование объекта класса QImage в качестве контекста рисования.
Класс QImage является контекстом рисования. Его целесообразно использовать в тех случаях, когда соображения качества и точности отображения преобладают над скоростью. Одно из необходимых условий для использования объекта класса QImage в качестве контекста рисования — формат изображения должен быть 32-битным, т. е. QImage::Format_ARGB32 или QImage::FormatARGB32_Premultiplied. Формат QImage::FormatARGB32_Premultiplied является более предпочтительным, т. к. он оптимизирован для операций рисования. Результат показан на рис. 1 — окно программы динамически изменяет размеры эллипса в соответ-ствии с изменениями своих размеров.

Рис.1. Пример рисования
class ImageDraw : public QWidget {
protected:
virtual void paintEvent(QPaintEvent*)
{
/*создается объект класса QImage с размерами виджета,
которые возвращаются методом size()*/
QImage img(size(), QImage::Format_ARGB32_Premultiplied);
//создаем объект рисования класса QPainter
QPainter painter;
/*в метод begin() передается адрес объекта QImage
в качестве контекста рисования*/
painter.begin(&img);
/*метод initFrom() инициализирует объект рисования такими настройками
из виджета, как цвет фона, стиль пера, шрифт и т. д.*/
painter.initFrom(this);
/*метод setRenderHint() устанавливает режим сглаживания
QPainter::Antialiasing; второй параметр true указывает, что этот режим
надо включить (false означало бы, что его надо отключить)*/
painter.setRenderHint(QPainter::Antialiasing, true);
/*метод eraseRect() очищает прямоугольную область, указанную в его параметре,
эта область соответствует текущей области виджета, которую возвращает
метод rect()*/
painter.eraseRect(rect());
painter.setBrush(QBrush(Qt::green, Qt::CrossPattern));
painter.setPen(QPen(Qt::red, 5, Qt::DotLine));
//рисование эллипса осуществляется методом drawEllipse()
painter.drawEllipse(0, 0, size().width(), size().height());
//вызов метода end() закрывает блок рисования на объекте QImage
painter.end();
painter.begin(this);
//содержимое объекта QImage отображается в области виджета
painter.drawImage(0, 0, img);
painter.end();
}
public:
ImageDraw(QWidget* pwgt = 0){};
virtual ~ImageDraw(){};
};Файлы приложения можно взять здесь.
На следующем шаге рассмотрим класс QPixmap.