修复了QGraphicsView中的变换叠加

时间:2011-06-16 16:53:51

标签: qt4 overlay transform qgraphicsview qgraphicsscene

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

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

然而,我宁愿将调色板/图例实现为一种(非交互式)覆盖层,它具有非常自己的转换。这有可能吗?

3 个答案:

答案 0 :(得分:2)

我认为你应该在QGraphics上下文中实现你的图例/调色板叠加,如果你移动(setPosition ...)这个项目以反转用户转换你随时会在图形树中重新索引项目平移/缩放......

做一个覆盖小部件肯定是可行的,但在这种情况下,因为它是你图形上下文的一部分,我建议你实现自己的QGraphicsView(wicth是一个小部件)重新实现paintEvent到在默认小部件空间中绘制调色板/图例(无转换)。此外,如果您的调色板/图例是静态的,您可以在像素图中渲染一次,只需在QGraphicsView需要更新时重新绘制此缓冲区像素图(当然,重新调整大小将需要更新缓冲区...)。

如果你不担心不相互作用的部分,你甚至不必转发事件。

答案 1 :(得分:2)

这是获得浮动图例(或其他)的一种非常简单的方法,我在Qt 4.8.5和Qt 5.2.1下进行了测试:

  1. 子类QGraphicsView
  2. 在子类中,为drawForeground(QPainter *,const QRectF&)方法添加覆盖方法
  3. 在覆盖方法中,在绘制任何内容之前调用painter-> resetTransform()
  4. 使用QPainter在视图顶部绘制图形,与使用任何其他QWidget一样
  5. 这很有效 - 特别是,使用这种方法,您不必计算任何反向坐标转换或更改视图的更新模式。

答案 2 :(得分:1)

也许我误解了你想要达到的目标,但你可以用QGraphicsItem :: Item Ignores Transformations标记QGraphicsItem标记,这样你就不需要对它进行逆变换了。