QGraphicsItem 在更改 boundingRect 时留下工件

QGraphicsItem leaves artifacts when changing boundingRect

我的 LineItem 继承自 QGraphicsLineItem 可以改变它的笔宽。

我创建了一个 boundingRect,它使用 QGraphicsLineItem::boundingRect 由根据笔宽和箭头计算的垫调整。有效。

void LineItem::calculateStuff() // called on any change including pen width
{
    qreal padLeft, padRight, padT;
    padLeft = 0.5 * m_pen.width();  // if no arrows
    padT = padLeft;
    padRight = padLeft;
    m_boundingRect = QGraphicsLineItem::boundingRect().adjusted(-padLeft, -padT, padRight, padT);
    update();
}
QRectF LineItem::boundingRect() const
{
    return m_boundingRect;
}
QPainterPath LineItem::shape() const
{
    QPainterPath p;
    p.addRect(m_boundingRect);
    return p;
}

我只得到一件神器:

尽管它们很漂亮(说真的,我认为它们是一个“特征 :-) )——我试图消除它们。我试图记住以前的边界矩形,并用以前的边界矩形更新项目——我想这就是该选项的用途 - 但它不起作用。

QRectF oldRect = selectedItem->boundingRect();
item->setItemPenWidth(p);
selectedItem->update(oldRect);
selectedItem->update();

我的视口有

setViewportUpdateMode(BoundingRectViewportUpdate);

如果我改成

setViewportUpdateMode(FullViewportUpdate);

我没有得到伪影 - 但我认为这会影响性能,这是一个主要限制因素。

如何修复这些瑕疵 - 仅在特定情况下出现,减少笔宽/减少线条的边界矩形,而不影响性能?

简单修复...我必须添加

prepareGeometryChange();

在我的 calculateStuff() 函数中。

我之前没有看到任何变化,这是我第一次更改我的 boundingRect,它没有无缝更新。