【问题标题】:QGraphicsItem leaves artifacts when changing boundingRectQGraphicsItem 在更改 boundingRect 时会留下伪影
【发布时间】:2015-08-14 23:31:30
【问题描述】:

我的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);

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

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

【问题讨论】:

    标签: qt qgraphicsview qgraphicsitem artifacts


    【解决方案1】:

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

    prepareGeometryChange();
    

    在我的calculateStuff() 函数中。

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

    【讨论】:

    • 在调用 prepareGeometryChange 之前更改边界矩形是未定义的行为。当然,您以前可能没有见过不良影响:这就是未定义的行为。感谢它没有格式化您的硬盘驱动器(未定义的行为本质上可能导致这种情况)。
    • @KubaOber 我认为它确实......有一次...... :-)......所以我每次都必须在更改boundingRect之前调用它,为每个属性.. . 当我说我没有看到变化时,我包括了这样一个事实,即即使没有这个调用,调整线条大小或添加箭头实际上也不会留下任何瑕疵,这令人费解。
    猜你喜欢
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多