【发布时间】:2016-03-06 05:03:53
【问题描述】:
我更新了diagramscene 示例以绘制窄线的法线。我将此行添加到Arrow::paint 功能:
painter->drawLine(line());
painter->drawLine(line().normalVector()); // this line was added
//...
//scene()->update(); //add this line make this paint function reloop infinitely
没有update,正常线不显示,如果我移动项目,它可以显示但不正确。使用 update ,一切都正确绘制,但 paint 函数无限循环。我无法解释为什么,请帮助我!
//--编辑:
我添加了originArrow::paint函数的代码:
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);
}
}
//-- 更新:答案:
QRectF Arrow::boundingRect() const
{
qreal extra = (pen().width() + 20) / 2.0;
QLineF myVLine = line().normalVector();
return QRectF(line().p1(), QSizeF(line().p2().x() - line().p1().x(),
line().p2().y() - line().p1().y()))
.normalized()
.adjusted(-extra, -extra, extra, extra)
.united(QRectF(myVLine.p1(), QSizeF(myVLine.p2().x() - myVLine.p1().x(),
myVLine.p2().y() - myVLine.p1().y())));
}
【问题讨论】:
-
这里没有太多代码可以帮助您调试。
-
@erip:在QCreator示例中,你可以搜索图表场景,我只添加一条线来绘制法线。
-
嗯,这很明显为什么会发生这种情况。
update函数调用你的绘图代码,然后又调用update等等......你必须从其他地方调用它,而不是从绘图代码。
标签: c++ qt qgraphicsitem qpainter