На этом шаге рассмотрим использование объекта класса 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.