Для отрисовки линии QPainter применяет метод drawLine(), который имеет ряд версий:
void QPainter::drawLine(const QLineF &line) void QPainter::drawLine(const QLine &line) void QPainter::drawLine(const QPoint &p1, const QPoint &p2) void QPainter::drawLine(const QPointF &p1, const QPointF &p2) void QPainter::drawLine(int x1, int y1, int x2, int y2)
В метод может передаваться объект линиии - QLine
/QLineF
, две точки QPointF
/QPoint
, между которыми строится линия, либо 4 координаты.
Для примера возьмем последний вариант:
#include <QApplication> #include <QWidget> #include <QPainter> class MyWidget : public QWidget { void paintEvent(QPaintEvent *event) { QPainter painter; painter.begin(this); painter.drawLine(10, 50, 150, 50); painter.end(); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget; widget.setFixedSize(250, 150); widget.setWindowTitle("METANIT.COM"); widget.show(); return app.exec(); }
Здесь рисуется линия, для которой начальная точка имеет координаты X=10, Y=50, а конечная точка - координаты X=150, Y=50
Отрисовка нескольких линий:
class MyWidget : public QWidget { void paintEvent(QPaintEvent *event) { QPainter painter; painter.begin(this); painter.drawLine(10, 30, 150, 30); painter.drawLine(150, 30, 150, 120); painter.drawLine(150, 120, 10, 120); painter.drawLine(10, 120, 10, 30); painter.end(); } };
Для отрисовки прямоугольников QPainter предоставляет метод drawRect():
void QPainter::drawRect(const QRectF &rectangle) void QPainter::drawRect(int x, int y, int width, int height) void QPainter::drawRect(const QRect &rectangle)
В метод передатется либо объект QRect/QRectF, который определяет прямоугольную область, либо x- и y-координаты верхнего левого угла прямоугольника и его ширина и высота:
class MyWidget : public QWidget { void paintEvent(QPaintEvent *event) { QPainter painter; painter.begin(this); // x=50, y=40, ширина = 100, высота = 50 painter.drawRect(50, 40, 100, 50); painter.end(); } };
Также в классе QPainter определен специальный метод для создания приямоугольника с закругленными углами - drawRoundedRect():
void drawRoundedRect(const QRectF &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize) void drawRoundedRect(int x, int y, int w, int h, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize) void drawRoundedRect(const QRect &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)
Здесь дополнительно передаются параметры xRadius
и yRadius
, которые устанавливают соответственно радиус закругления по оси X и Y. А последний
параметр - mode
указывает, как будут интепретироваться значения радиусов - как абсолютные значения (Qt::AbsoluteSize) или как процентные значения относительно ширины и высоты прямоугольника (Qt::RelativeSize)
class MyWidget : public QWidget { void paintEvent(QPaintEvent *) { QRectF rectangle(10.0, 20.0, 120.0, 80.0); QPainter painter(this); painter.drawRoundedRect(rectangle, 20.0, 15.0); } };
Для отриовки линии, которая соединяет несколько точек, применяется метод drawPolyline():
void QPainter::drawPolyline(const QPointF *points, int pointCount) void QPainter::drawPolyline(const QPolygonF &points) void QPainter::drawPolyline(const QPoint *points, int pointCount) void QPainter::drawPolyline(const QPolygon &points)
В метод передается массив точек с количеством точек либо объекты QPolygonF. Например:
class MyWidget : public QWidget { void paintEvent(QPaintEvent *) { QPainter painter; painter.begin(this); painter.drawPolyline({QPointF(120, 20), QPointF(220, 130), QPointF(20, 130)}); painter.end(); } };
Для отрисовки многоугольника применяется метод drawPolygon():
void QPainter::drawPolygon(const QPointF *points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill) void QPainter::drawPolygon(const QPolygonF &points, Qt::FillRule fillRule = Qt::OddEvenFill) void QPainter::drawPolygon(const QPoint *points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill) void QPainter::drawPolygon(const QPolygon &points, Qt::FillRule fillRule = Qt::OddEvenFill)
В качестве первого параметра передается массив точек или объект QPolygon. Последний параметр определяет алгоритм заполнения фигуры.
class MyWidget : public QWidget { void paintEvent(QPaintEvent *) { QPainter painter; painter.begin(this); painter.drawPolygon({QPointF(120, 20), QPointF(220, 130), QPointF(20, 130)}); painter.end(); } };
Можно заметить, что в данном случае в метод передается объект QPolygonF с тем же набором точек, что и в предыдущем примере с drawPolyline()
, только теперь последняя
точка соединяется с первой.
Для отрисовки овалов/окружностей применяется метод drawEllipse()
void QPainter::drawEllipse(const QRectF &rectangle) void QPainter::drawEllipse(const QRect &rectangle) void QPainter::drawEllipse(const QPointF ¢er, qreal rx, qreal ry) void QPainter::drawEllipse(const QPoint ¢er, int rx, int ry) void QPainter::drawEllipse(int x, int y, int width, int height)
В метод передается набоп значений для определения прямоугольной области, которая будет определять границы овала. Например, применим последнюю версию:
class MyWidget : public QWidget { void paintEvent(QPaintEvent *) { QPainter painter; painter.begin(this); painter.drawEllipse(10, 10, 80, 80); painter.drawEllipse(100, 10, 80, 60); painter.end(); } };
В первом случае в метод передается квадратная область, поэтому будет создаваться окружность. Во втором случае стороны прямоугольника не равны, поэтому будет формироваться овал.
Для отрисовки дуг применяется метод drawArc():
void drawArc(const QRectF &rectangle, int startAngle, int spanAngle) void drawArc(const QRect &rectangle, int startAngle, int spanAngle) void drawArc(int x, int y, int width, int height, int startAngle, int spanAngle)
В метод передается прямоугольная область, на основе которой формируется овал. А последние два параметра определяют начальный и конечный угол, которые применяются для обрезки дуги. Последние два параметра должны быть указаны в 1/16 градуса, т. е. полный круг равен 5760 (16 * 360). Положительные значения углов означают направление против часовой стрелки, а отрицательные значения означают направление по часовой стрелке. Пример дуги:
class MyWidget : public QWidget { void paintEvent(QPaintEvent *) { QRectF rectangle(10.0, 20.0, 180.0, 160.0); int startAngle = 30 * 16; int spanAngle = 120 * 16; QPainter painter(this); painter.drawArc(rectangle, startAngle, spanAngle); } };
Для открисовки кругового сектора применяется метод drawPie():
void drawPie(const QRectF &rectangle, int startAngle, int spanAngle) void drawPie(int x, int y, int width, int height, int startAngle, int spanAngle) void drawPie(const QRect &rectangle, int startAngle, int spanAngle)
В метод передаются параметры прямоугольной области для построения окружности и начальный и конечный углы, которые применяются для обрезки сектора. Применение
class MyWidget : public QWidget { void paintEvent(QPaintEvent *) { QRectF rectangle(10.0, 20.0, 180.0, 160.0); int startAngle = 30 * 16; int spanAngle = 120 * 16; QPainter painter(this); painter.drawPie(rectangle, startAngle, spanAngle); } };
Для отрисовки пути QPainter предоставляет метод drawPath(), в который передается ссылка на объект QPainterPath:
drawPath(const QPainterPath &path)
Тип QPainterPath представляет геометрический путь, который объединяет простейшие графические примитивы. Для добавления примитивов в путь класс предоставляет ряд методов. Основные из них:
addEllipse()
: добавляет эллипс
addPath()
: добавляет другой путь
addPolygon()
: добавляет многоугольник
addRect()
: добавляет прямоугольник
addRoundedRect()
: добавляет прямоугольник с загругленными углами
addText()
: добавляет текст
arcTo()
: добавляет дугу
cubicTo()
: добавляет кубическую кривую Безье
lineTo()
: добавляет линию
quadTo()
: добавляет квадратную кривую Безье
Посмотрим на простейшем примере с добавлением линий:
#include <QApplication> #include <QWidget> #include <QPainter> #include <QPainterPath> class MyWidget : public QWidget { void paintEvent(QPaintEvent *event) { QPainterPath path; path.moveTo(115, 10); path.lineTo(230, 140); path.lineTo(10, 140); path.lineTo(115, 10); QPainter painter(this); painter.drawPath(path); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MyWidget widget; widget.setFixedSize(250, 150); widget.setWindowTitle("METANIT.COM"); widget.show(); return app.exec(); }
В данном случае в путь добавляются три линии, которые в целом образуют треугольник
В примере выше в путь добавляются три линии, но в реальности нам достаточно двух линий, поскольку класс QPainterPath предоставляет метод closeSubpath(), который позволяет закрыть путь - автоматически соединить линией первую и последнюю точку пути:
class MyWidget : public QWidget { void paintEvent(QPaintEvent *event) { QPainterPath path; path.moveTo(115, 10); path.lineTo(230, 140); path.lineTo(10, 140); //path.lineTo(115, 10); path.closeSubpath(); // закрываем путь QPainter painter(this); painter.drawPath(path); } };