I'm trying to draw an arrow so I just referred to the example code where we can draw arrows:
http://doc.qt.io/qt-5/qtwidgets-graphicsview-elasticnodes-edge-cpp.html
I decided to draw using the same formula and tried like:
theCurrentLine->setP1(QPointF(0, 0) );
theCurrentLine->setP2((theLineVector));
p->drawLine(*theCurrentLine);
double angle = ::acos(theCurrentLine->dx() / theCurrentLine->length());
if (theCurrentLine->dy() >= 0)
angle = TwoPi - angle;
QPointF sourcePoint = QPointF(0,0);
QPointF sourceArrowP1 = sourcePoint + QPointF(sin(angle + Pi / 3) * theArrowSize,
cos(angle + Pi / 3) * theArrowSize);
QPointF sourceArrowP2 = sourcePoint + QPointF(sin(angle + Pi - Pi / 3) * theArrowSize,
cos(angle + Pi - Pi / 3) * theArrowSize);
p->drawPolygon(QPolygonF() << theCurrentLine->p1() << sourceArrowP1 << sourceArrowP2);
but now I want to draw the line after the arrow head polygon gets drawn.
How can I change the P1()
value of the theCurrentLine
which can start after the polygon as currently the polygon(arrowHead)
and the line start at the same point? I need to start the line after the arrow head is drawn. The reason is sometimes if the pen width increases the arrow head looks smaller than the line.
You can get the point at index in QPolygon.
QPoint QPolygon::point ( int index ) const
It would be easy when you know how many points there are. And Qt documentation is your friend.
And you could use count(), for example:
QPoint lastPoint = myPolygon.point(myPolygon.count() - 1);
Just give a name to your polygon, and you'll be fine.
Edit: Latest version of these codes should solve your problem. I thought I need to give an example. You need to add the points in this order:
QPolygon myPolygon;
myPolygon.setPoint(0, sourceArrowP1);
myPolygon.setPoint(1, theCurrentLine->p1());
myPolygon.setPoint(2, sourceArrowP2);
p->drawPolygon(myPolygon);
QPoint lastPoint;
lastPoint = myPolygon.point(myPolygon.count() - 1);
You need to draw the line between last and first points. Here:
p->drawLine(myPolygon.point(0, myPolygon.point(myPolygon.count() - 1));
If you want your arrow head to be filled with color, you need to use QPainterPath instead of QPolygon:
QPen pen(Qt::black); //Or whatever color you want
pen.setWidthF(10); //Or whatever size you want your lines to be
QBrush brush(Qt::red); //Or whatever color you want to fill the arrow head
p->setPen(pen);
p->setBrush(brush);
QPainterPath arrow(sourceArrowP1);
arrow.lineTo(theCurrentLine->p1());
arrow.lineTo(sourceArrowP2);
arrow.lineTo(sourceArrowP1); //This returns to the first point. You might eliminate this line if you want to.
p->drawPath(arrow);