【问题标题】:Qt4: "subview" using QGraphicsViewQt4:使用 QGraphicsView 的“子视图”
【发布时间】:2013-03-03 01:45:40
【问题描述】:

使用 QGraphicsView/QGraphicsScene/QGraphicsItem,我需要创建另一个 QGraphicsItem 的多个视图。

换句话说,在 QGraphicsScene 中,我需要创建多个 QGraphicItem,它们显示存储在屏幕外某处的其他 QGraphicsItem 的一部分。它有点像模型/视图框架,其中一个 QGraphicsItem 充当模型,而其他 QGraphicsItem 充当视图 - 显示(剪辑)其他项目的部分。 (见附图)

我该怎么做?请注意,“视图”不应该是只读的。每个视图都应该对鼠标移动、键盘输入做出反应,并且当模型中的某些项目发生变化时应该正确地重新绘制自己。

最愚蠢的做法是将隐藏的项目绘制到 QImage 上,然后在其他项目中显示该 QImage 的部分。然而,这将意味着大量的内存浪费。还有其他方法吗?

Qt 4.8,VC2008 express,Windows 平台。

--编辑--

我需要在场景中显示部分场景(或屏幕外 QGraphicsItem)。这有点像 3D 游戏中的传送门。

【问题讨论】:

  • 为什么你的“模型”是QGraphicsItem?我会以“模型”是提供必要数据的普通 C++(可能是 Qt-)对象的方式设计它,以便每个“视图”QGraphicsItem 可以获取相关数据并相应地绘制它跨度>
  • @Andreas:因为我需要多次显示同一个 QGraphicsItem 的部分。
  • 好的,所以你的“模型”项目的paint()已经根据需要绘制了所有东西,你只想在你的“视图”项目中显示绘制结果中的特定区域,对吧?跨度>
  • 您是否尝试从视图项的paint() 方法中简单地调用模型项的paint() 方法,并在之前设置适当的翻译转换(并且可能在查看项目)?
  • @Andres:是的,但它必须对鼠标移动做出反应,处理焦点/选择,并且如果底层模型发生变化,视图必须正确重绘自己。 这就是的问题。

标签: c++ qt qt4


【解决方案1】:

经过一些研究,我发现(据我所知)Qt 没有(记录的)这种情况的方法。

所以我决定写几个我自己的方法来

  1. 将 QGraphicsItems 层次结构绘制到任何 QPaintDevice(遍历子层次结构 + 为所有涉及的项目调用 paint() 方法)
  2. 将任何区域的输入(鼠标/键盘)事件转换为选定的 QGraphicsItem。

这实际上可能有点棘手,因为我需要处理剪裁(根据形状剪裁子项的项目)和重绘复杂的组件,例如 QGraphicsWidget,但据我所知,这是可以做到的。此外,这样做我将失去 QGraphicsView 提供的 BSP 优化,但对于我的特定场景来说,这应该是一个可以接受的折衷方案。

【讨论】:

    猜你喜欢
    • 2010-12-29
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多