4

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

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

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

4

3 回答 3

3

我认为你应该在 QGraphics 上下文之外实现你的图例/调色板覆盖,如果你移动(setPosition ...)这个项目来反转用户转换,你的项目将在你平移/缩放的任何时候在图形树中重新索引...

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

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

于 2011-06-22T19:35:56.970 回答
3

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

  1. 子类 QGraphicsView
  2. 在您的子类中,为 drawForeground(QPainter *, const QRectF &) 方法添加一个覆盖方法
  3. 在您的覆盖方法中,在绘制任何内容之前调用painter->resetTransform()
  4. 使用 QPainter 在视图顶部绘制图形,与使用任何其他 QWidget 相同

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

于 2014-04-30T23:16:03.307 回答
2

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

于 2011-07-05T08:02:00.857 回答