2D графика. Класс QPainter

Помечено: , ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 5 мес., 4 нед. назад.

  • Автор
    Сообщения
  • #4011

    С помощью класса QPainter мы можем рисовать на любом объекте, унаследованном от класса QPaintDevice (QWidget, QPrinter, QImage, QGLFramebufferObject и др.). Можно рисовать геометрические фигуры, пиксельные карты, текст. Для начала рассмотрим классы, которые могут быть полезны при работе с QPainter.

    Классы QPoint и QPointF служат для задания положения точки в двухмерной системе координат. QPoint — для целых чисел и QPointF — для вещественных. К точкам применимы операции сложения, вычитания, умножения, деления:

    QPoint point(5, 5);
    QPoint point2(10, 10);
    point+= point2;
    point*= 2;

    Также точки можно сравнивать между собой и на равенство их координат нулю.

    QPoint point(5, 10);
    QPoint point2(5, 10);
    if (point == point2) {
      //...
    }
     
    bool bln;
    bln = point.isNull();

    Классы QSize и QSizeF служат для хранения размера. Кроме методов, аналогичных методам классов QPoint и QPointF, данные классы обладают методом scale(), позволяющим масштабировать графический объект.

    Классы QRect и QRectF служат для хранения прямоугольных областей(координат верхнего левого угла и размера):

    QRectF(QPointF point, QSizeF size);

    Классы QLine и QLineF описывают прямую линию. Классы QPolygon и QPolygonF описывают замкнутую фигуру, образованную прямыми линиями.

    C помощью класса QColor можно хранить информацию о цвете. Среда Qt поддерживает 3 цветовые модели: RGB, CMYK и HSV. Для цветовой модели RGB существует структура QRgb. Существует несколько способов задания цвета в объекте класса QColor:

    • Передача параметров в конструктор:
      unsigned int red = 50;
      unsigned int green = 100;
      unsigned int blue = 0;
      unsigned int alpha = 128;
      QColor mycolor(red, green, blue, alpha);
      QRgb rgb1 = (50, 100, 0);
      QColor mycolor2(rgb1);
    • С помощью методов QColor::setRgb(), QColor::setRgba(), QColor::setRgbF(), QColor::setHsv(), QColor::setHsvF(), QColor::setCmyk(), QColor::setCmykF():
      QColor mycolor;
      mycolor.setHsv(200, 100, 50);

    Существует возможность установить цвет в одной модели и считать в другой:

    unsigned int h, s, v;
    QColor mycolor(100, 100, 100);
    mycolor.getHsv(&h, &s, &v);

    Вернемся к классу QPainter. Для того, чтобы начать рисовать нам достаточно создать объект класса QPainter и передать ему указатель на объект для рисования:

    void Wnd::paintEvent(QPaintEvent *event) {
        QLineF line(10.0, 80.0, 90.0, 20.0);
        QPainter pnt(this);
        pnt.drawLine(line);
        //...
    }

    или
    void Wnd::paintEvent(QPaintEvent *event) {
        QLineF line(10.0, 80.0, 90.0, 20.0);
        QPainter pnt;
        pnt.begin(this);
        pnt.drawLine(line);
        //...
    }

    Метод QWidget::paintEvent() вызывается для виджетов, которые должны быть перерисованы.

    В большинстве случаев рисование производится одним объектом QPainter на нескольких объектах рисования. Для сохранения старых настроек рисования(при переходе на новый объект) можно воспользоваться методами QPainter::save() и QPainter::restore(). QPainter::save() помещает в стек установки, а QPainter::restore() — извлекает.

    Для рисования контуров фигуры необходимо передать объекту класса QPainter объект класса QPen (перо) с помощью QPainter::setPen().

    С помощью соответствующих методов можно установить стиль пера(цвет, толщину, вид концов линии).

    Для заполнения замкнутых контуров используется кисть т.е. объект класса QBrush. По аналогии с классом QPen кисть устанавливается методом QPainter::setBrush(). В него можно передать либо объект QBrush, либо один из предопределенных стилей BrushStyle:

    QPainter pnt(this);
    pnt.setBrush(QBrush(Qt::blue, Qt::VerPattern)); // голубая кисть с вертикальной штриховкой

    Класс QPainter позволяет поворачивать, масштабировать, смещать объекты, делать скос. Для этих операций имеются соответствующие методы: rotate(), scale(), translate(), sheap().

    Библиотека Qt поддерживает технику сглаживания (Anti-Aliasing, антиалиасинг):

    QPainter pnt;
    pnt.setRenderHint(QPainter::antialiasing, true);

Для ответа в этой теме необходимо авторизоваться.