为啥缩放 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.xself.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:缩放视图矩形时不要缩放项目

实现缩放滑块 QGraphicsView

缩放 QGraphicsScene 以填充整个 QGraphicsView

如何在 QGraphicsView 中启用平移和缩放

QgraphicsView 橡皮筋拖动效果缩放行为