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,它没有无缝更新。
我的 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,它没有无缝更新。