Класс QImage как контекст рисования

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

   
Файлы приложения можно взять Предыдущий шаг
Содержание
Следующий шаг



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий