更改boundingRect时,QGraphicsItem会留下工件

Tha*_*lia 5 qt artifacts qgraphicsview qgraphicsitem

我的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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的只有一件神器:

  • 如果我增加笔的宽度,然后减少它,我会得到痕迹:

在此输入图像描述 在此输入图像描述

  • 当我移动鼠标或任何动作(我很难获得屏幕截图)时,这些当然会消失

尽管它们很漂亮(严肃地说我认为它们是"功能:-)) - 我试图消除它们.我试图记住以前的边界矩形,并用前一个边界矩形更新项目 - 我认为这是什么选项是为了 - 但它不起作用.

QRectF oldRect = selectedItem->boundingRect();
item->setItemPenWidth(p);
selectedItem->update(oldRect);
selectedItem->update();
Run Code Online (Sandbox Code Playgroud)

我的视口有

setViewportUpdateMode(BoundingRectViewportUpdate);
Run Code Online (Sandbox Code Playgroud)

如果我换到

setViewportUpdateMode(FullViewportUpdate);
Run Code Online (Sandbox Code Playgroud)

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

如何修复这些工件 - 仅在特定情况下发生,减小笔宽/减少线的边界矩形,而不影响性能?

Tha*_*lia 5

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

prepareGeometryChange();
Run Code Online (Sandbox Code Playgroud)

在我的calculateStuff()职能中。

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