Qt4 修复了QGraphicsView中的变换覆盖

Qt4 修复了QGraphicsView中的变换覆盖,qt4,overlay,transform,qgraphicsview,qgraphicsscene,Qt4,Overlay,Transform,Qgraphicsview,Qgraphicsscene,在我正在开发的基于Qt的应用程序中,我使用QGraphicsView在2D网格中显示传感器数据。在侧面,我想展示一个图例/调色板,将网格中的颜色与值联系起来 用户可以缩放和平移传感器数据视图,但可以理解的是,调色板在视图中应该是固定的。因此,在传感器视图场景中放置调色板/图例需要一些额外的注意:应用逆用户变换 不过,我更希望调色板/图例能够实现为一种(非交互)覆盖层,并具有自己的转换。这可能吗?我认为您应该在QGraphics上下文之外实现图例/调色板覆盖,如果您移动(设置位置…)此项以反转用户

在我正在开发的基于Qt的应用程序中,我使用QGraphicsView在2D网格中显示传感器数据。在侧面,我想展示一个图例/调色板,将网格中的颜色与值联系起来

用户可以缩放和平移传感器数据视图,但可以理解的是,调色板在视图中应该是固定的。因此,在传感器视图场景中放置调色板/图例需要一些额外的注意:应用逆用户变换


不过,我更希望调色板/图例能够实现为一种(非交互)覆盖层,并具有自己的转换。这可能吗?

我认为您应该在QGraphics上下文之外实现图例/调色板覆盖,如果您移动(设置位置…)此项以反转用户转换,您的项将在平移/缩放时在图形树中重新索引

做一个覆盖小部件是绝对可行的,但在这种情况下,由于它是图形上下文的一部分,我建议实现您自己的
QGraphicsView
(它是一个小部件)重新实现
paintEvent
,在默认小部件空间中绘制调色板/图例(无转换)。另外,如果调色板/图例是静态的,您可以在pixmap中渲染一次,只要在
QGraphicsView
需要更新时重新绘制该缓冲区pixmap即可(当然,重新调整大小需要更新缓冲区…)


如果您这样做,就不必担心非交互部分,您甚至不必转发事件。

也许我误解了您想要实现的目标,但是您可以使用QGraphicsItem::ItemIgnorestTransformations标志标记QGraphicsItem,这样您就不必对其应用反变换。

这里有一个获取浮动图例的非常简单的方法(或等等),我在Qt 4.8.5和Qt 5.2.1下对其进行了测试:

  • 子类QGraphicsView
  • 在子类中,为drawForeground(qPaint*,const QRectF&)方法添加覆盖方法
  • 在重写方法中,在绘制任何内容之前调用painter->resetTransform()
  • 使用QPaint在视图顶部绘制图形,与使用任何其他QWidget一样

  • 这很有效——特别是,使用这种方法,您不必计算任何逆坐标变换或更改视图的更新模式。

    关键是,调色板图例也需要应用变换,以使用QGraphicsView对其进行缩放。从技术上讲,我想要的是两个QGraphicsCenes层叠在一起在一个QGraphicsView(或两个QGraphicsView相互重叠)中。顺便说一句,我注意到这种技术存在一个问题——如果用户使用滚动条滚动QGraphicsView,覆盖区域可能会在视图中留下不需要的视觉瑕疵。我通过覆盖QGraphicsView::scrollContentsBy(int,int)来解决这个问题,同时调用scene()->使无效()。