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

С помощью класса 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);
page_revision: 17, last_edited: 1209299687|%e %b %Y, %H:%M %Z (%O ago)
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License