我正在使用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应用程序使用它。