я работаю над проектом, который состоит в создании инструмента uml с помощью qt, и сейчас у меня проблема с рисованием текста на стрелке, так что это мой код:
void Arrow::paint(QPainter *painter, const QStyleOptionGraphicsItem * ,QWidget *)
{
if (myStartItem->collidesWithItem(myEndItem))
return;
QPen myPen = pen();
myPen.setColor(myColor);
qreal arrowSize = 20;
painter->setPen(myPen);
painter->setBrush(myColor);
QLineF centerLine(myStartItem->pos(), myEndItem->pos());
QPolygonF endPolygon = myEndItem->polygon();
QPointF p1 = endPolygon.first() + myEndItem->pos();
QPointF p2;
QPointF intersectPoint;
QLineF polyLine;
for (int i = 1; i < endPolygon.count(); ++i)
{
p2 = endPolygon.at(i) + myEndItem->pos();
polyLine = QLineF(p1, p2);
QLineF::IntersectType intersectType =
polyLine.intersect(centerLine, &intersectPoint);
if (intersectType == QLineF::BoundedIntersection)
break;
p1 = p2;
}
setLine(QLineF(intersectPoint, myStartItem->pos()));
double angle = ::acos(line().dx() / line().length());
if (line().dy() >= 0)
angle = (Pi * 2) - angle;
QPointF arrowP1 = line().p1() + QPointF(sin(angle + Pi / 3) * arrowSize,
cos(angle + Pi / 3) * arrowSize);
QPointF arrowP2 = line().p1() + QPointF(sin(angle + Pi - Pi / 3) * arrowSize,
cos(angle + Pi - Pi / 3) * arrowSize);
arrowHead.clear();
arrowHead << line().p1() << arrowP1 << arrowP2;
painter->drawLine(line());
//painter->drawPolygon(arrowHead);
if (isSelected())
{
painter->setPen(QPen(myColor, 1, Qt::DashLine));
QLineF myLine = line();
myLine.translate(0, 4.0);
painter->drawLine(myLine);
myLine.translate(0,-8.0);
painter->drawLine(myLine);
QPoint point = QPoint( 10, 20 );
painter->drawText( point, "You can draw text from a point..." );
}
}
и ничего не происходит, я могу нарисовать стрелку, но текст не появляется на стрелке, что мне делать? пожалуйста, мне нужна помощь
ИМО, ты сделал это неправильно.
Вы должны составить свой графический элемент, используя QGraphicsPathItem
, QGraphicsPolygonItem
, QGraphicsRectItem
, а также QGraphicsSimpleTextItem
вместо того, чтобы рисовать все самостоятельно.
Просто предоставьте некоторый корневой элемент, отвечающий за управление дочерними элементами (строки текста и полигоны). Будет проще сделать это правильно.
Во-вторых, ваш метод рисования неисправен. Вам следует восстановить первоначальное состояние художника!
И, наконец, я уверен, что ваша проблема вызвана неправильной реализацией boundingRect
, Это довольно распространенная ошибка при выполнении такого сложного рисования методом рисования.