更改boundingRect时,QGraphicsItem会留下工件

时间:2015-08-14 14:58:51

标签: qt qgraphicsview qgraphicsitem artifacts

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;
}

我只得到一件神器:

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

enter image description here enter image description here

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

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

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

我的视口有

setViewportUpdateMode(BoundingRectViewportUpdate);

如果我改为

setViewportUpdateMode(FullViewportUpdate);

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

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

1 个答案:

答案 0 :(得分:3)

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

prepareGeometryChange();

在我的calculateStuff()函数中。

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