为啥缩放 qgraphicsview qgraphicsitem 后会留下痕迹
Posted
技术标签:
【中文标题】为啥缩放 qgraphicsview qgraphicsitem 后会留下痕迹【英文标题】:Why after zooming qraphicsview qraphicsitem leaves traces为什么缩放 qgraphicsview qgraphicsitem 后会留下痕迹 【发布时间】:2021-04-03 23:27:02 【问题描述】:在缩放模式下移动对象时,对象开始留下痕迹,但在正常模式下一切正常。我认为这是一个 bouldingRect,但是我的一个问题提供了一个正常的实现。
我的 MRE 在这个问题中My last question
【问题讨论】:
您是否按照我的回答正确更改了boundingRect
函数并删除了对self.x
和self.y
的所有使用?
@musicamante 一切都按照你的食谱,也许这就是高倍放大的错误?
@musicamante 渲染时可能会出现这种情况,pianter 设置可以提供帮助吗?
【参考方案1】:
这是由于轮廓的绘制,如果它在边框上绘制,它总是占据笔宽的一半。正如有关 boundingRect()
的文档所解释的那样:
注意:对于绘制轮廓/笔划的形状,在边界矩形中包含笔宽的一半很重要。不过,没有必要补偿抗锯齿。
由于在您的情况下您在 init 中指定了笔宽,因此您可以使用该值:
def boundingRect(self):
return QRectF(
-self.penWidth / 2,
-self.penWidth / 2,
self.w + self.penWidth,
self.h + self.penWidth)
请注意,您实际上没有在画家中使用该笔,因此应该在paint()
函数中使用painter.setPen(QtGui.QPen(self.pen_color, self.penWidth))
来完成更正确的实现。要稍微提高性能,请在 init 中创建一个 QPen 并将其直接用于setPen()
。
还请注意,在画笔中更改的每个设置(包括笔和画笔)都不应该是持久的,因此最好记住在 paint()
和 qp.restore()
之前的开头放置一个 qp.save()
回来了。
【讨论】:
你是最棒的!) 由于该问题可能对其他人有用,因此我将保持原样,但为了将来参考,请考虑在原始答案中进行澄清。此外,您应该编辑您的问题以包含 valid minimal, reproducible example(在此处阅读我的评论)。以上是关于为啥缩放 qgraphicsview qgraphicsitem 后会留下痕迹的主要内容,如果未能解决你的问题,请参考以下文章
如何并排执行两个 QGraphicsViews 的 50/50 布局?
QGraphicsView 和 QGraphicsItem:缩放视图矩形时不要缩放项目