54 const qreal Pi = 3.14;
71 : QGraphicsLineItem(parent)
72 , m_StartItem(startItem)
74 , m_pConnection(connection)
76 m_StartItem = startItem;
78 setFlag(QGraphicsItem::ItemIsSelectable,
true);
80 setPen(QPen(m_qColor, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
86 QRectF Arrow::boundingRect()
const
88 qreal extra = (pen().width() + 20) / 2.0;
90 return QRectF(line().p1(), QSizeF(line().p2().x() - line().p1().x(),
91 line().p2().y() - line().p1().y()))
93 .adjusted(-extra, -extra, extra, extra);
99 QPainterPath Arrow::shape()
const
101 QPainterPath path = QGraphicsLineItem::shape();
102 path.addPolygon(arrowHead);
109 void Arrow::updatePosition()
111 QLineF line(mapFromItem(m_StartItem, 0, 0), mapFromItem(m_EndItem, 0, 0));
118 void Arrow::paint(QPainter *painter,
const QStyleOptionGraphicsItem *,
121 if (m_StartItem->collidesWithItem(m_EndItem))
125 myPen.setColor(m_qColor);
126 qreal arrowSize = 10;
127 painter->setPen(myPen);
128 painter->setBrush(m_qColor);
130 painter->setRenderHint(QPainter::Antialiasing);
133 QLineF centerLine(m_StartItem->pos(), m_EndItem->pos());
134 QPolygonF endPolygon = m_EndItem->polygon();
135 QPointF p1 = endPolygon.first() + m_EndItem->pos();
137 QPointF intersectPoint;
139 for (
int i = 1; i < endPolygon.count(); ++i) {
140 p2 = endPolygon.at(i) + m_EndItem->pos();
141 polyLine = QLineF(p1, p2);
142 QLineF::IntersectType intersectType =
143 polyLine.intersect(centerLine, &intersectPoint);
144 if (intersectType == QLineF::BoundedIntersection)
149 setLine(QLineF(intersectPoint, m_StartItem->pos()));
151 double angle = ::acos(line().dx() / line().length());
152 if (line().dy() >= 0)
153 angle = (Pi * 2) - angle;
155 QPointF arrowP1 = line().p1() + QPointF(sin(angle + Pi * 2 / 5) * arrowSize,
156 cos(angle + Pi * 2 / 5) * arrowSize);
157 QPointF arrowP2 = line().p1() + QPointF(sin(angle + Pi - Pi * 2 / 5) * arrowSize,
158 cos(angle + Pi - Pi * 2 / 5) * arrowSize);
161 arrowHead << line().p1() << arrowP1 << arrowP2;
162 painter->drawLine(line());
163 painter->drawPolygon(arrowHead);
165 painter->setPen(QPen(m_qColor, 1, Qt::DashLine));
166 QLineF qLine = line();
167 qLine.translate(0, 4.0);
168 painter->drawLine(qLine);
169 qLine.translate(0,-8.0);
170 painter->drawLine(qLine);
QSharedPointer< PluginConnectorConnection > SPtr