gpt4 book ai didi

qt - QGraphicsItem 在更改boundingRect 时留下工件

转载 作者:行者123 更新时间:2023-12-02 02:02:16 33 4
gpt4 key购买 nike

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

我的视口(viewport)有

setViewportUpdateMode(BoundingRectViewportUpdate);

如果我改为

setViewportUpdateMode(FullViewportUpdate);

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

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

最佳答案

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

prepareGeometryChange();

在我的calculateStuff()函数中。

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

关于qt - QGraphicsItem 在更改boundingRect 时留下工件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32013051/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com