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)





