QGraphicsRectItem.paint中的透明度在移动项目时留下痕迹



我正在使用PyQt4开发节点编辑器,已经整理好了QGraphicsView和QGraphicsItem的基础知识,但在透明度方面遇到了问题。

我的代码如下,它看起来与我找到的样本相似,但当我四处移动节点时,会根据链接的图像留下痕迹。

我是否错过了一些需要设置的标志或某个地方的某种更新调用?

链接到输出示例

def paint(self, painter, option, widget=None):
    painter.setPen(Node.shadow_color)
    painter.setBrush(Node.shadow_color)
    painter.setOpacity(0.3)
    shadow_rect = self.rect()
    shadow_rect.translate(Node.shadow_offset, Node.shadow_offset)
    painter.drawRoundedRect(shadow_rect, Node.corner_radius, Node.corner_radius)
    if self.check_state(Node.SELECTED):
        painter.setPen(Node.outline_selected_colour)
        painter.setBrush(Node.background_selected_colour)
    else:
        painter.setPen(Node.outline_colour)
        painter.setBrush(Node.background_colour)
    if self.check_state(Node.HOVER):
        painter.setPen(Node.outline_hover_colour)
        painter.setBrush(Node.background_hover_colour)
    painter.setOpacity(1.0)
    painter.drawRoundedRect(self.rect(), Node.corner_radius, Node.corner_radius)

QGraphicsView只更新由节点的QRect区域定义的边界区域。

当您从上一个位置拖动节点时,您的阴影实际上是在项目的边界矩形之外绘制的(由QGraphicsRecctItem.rerect()定义),因此视图不会重新绘制该空间-这就是您看到轨迹的原因。

您可以尝试将QGraphicsView.viewportUpdateMode设置为类似FullViewportUpdate的模式,看看它是否解决了您的问题(尽管它会带来性能打击),但我建议将节点的矩形视为边界绘制区域,并偏移节点及其阴影的实际大小,以便在该空间内绘制,而不是在该空间外绘制边界和阴影。

如果你想把它作为PyQt扩展的开源ProjexUI库的一部分来查看(或使用),我有一个节点小部件。它位于:

http://dev.projexsoftware.com/projects/projexui

这个类是projexui.widgets.xnodewidget,我用它做很多不同的事情,但Orbiter应用程序使用它。

相关内容

  • 没有找到相关文章

最新更新