1

我对以下问题感到困扰:

我正在使用QGraphicsScene需要根据用户的操作呈现 SQL 查询的图形表示的交互式交互,例如:向查询中添加某些内容(表、新列、其他内容)或从查询中删除某些内容(关键字、表格、列...)。场景的变化必须在操作后显示出来,应用程序的“逻辑层”也需要跟踪用户所做的操作,因为查询的“渲染”是由“逻辑”层完成的(即: “逻辑层”创建所有QGraphicsItemGroup派生对象,在构建所有逻辑层组件之后,这些派生对象将被添加到查询的图形场景中并放在窗口上)。

发生的问题如下:现在我没有找到任何可用的解决方案来以最平滑的方式在更改后呈现查询。

请允许我在屏幕截图中链接以进行进一步说明:

查询生成器的屏幕截图

假设用户想要PERSON.NAME从查询中删除该列。应用程序中会发生什么:

  • 用户单击PERSON.NAME列图形项的“删除”(列名后的红色小 X)按钮
  • Graphics View 感知到这个操作,将 REMOVE 列从图形系统发送到“逻辑层”(“模型”)
  • 逻辑层依次删除代表PERSON.NAME列的相应“逻辑层”对象,

麻烦从这里开始:

  • 整个图形(是的,一切)由逻辑层重新渲染,为同一查询创建图形项,没有PERSON.NAME
  • 然后我必须创建一个新窗口,其中包含一个新QGraphicsScene对象和一个QGraphicsView
  • 将表示查询的重新渲染对象的图形项(但现在没有PERSON.NAME列)插入新QGraphicsSceneaddItem()
  • 现在用新窗口替换应用程序的中央小部件。
  • 现在您可以看到,确实,在查询PERSON.NAME中不再存在,并且下面的所有图形元素都PERSON.NAME在屏幕上向上移动。

显然这不是一个好的解决方案,当我改变窗口时有一个难看的闪烁,但我直到现在都没有找到更好的解决这个问题的方法。

因此,我请求您的帮助,以确定可以对这种在删除(添加)新元素时更新屏幕的方法进行哪些改进,这些新元素知道上面的背景信息,而无需新窗口。显然,也欢迎其他与 mroe 通用图形相关的评论。

谢谢,f

4

1 回答 1

3

根据问题和评论中的信息,您可以考虑以下几点:

首先,您需要摆脱创建新窗口和QGraphicsView刷新时的新窗口。我想这是闪烁的主要原因。保持你的 UI 结构不变,只修改场景。您可以使用以下方法之一:

  1. 要么创建一个新的QGraphicsScene并将其设置为视图的场景,要么调用clear()现有的场景。然后QGraphicsItems从您的本机模型重新创建您的模型,并确保您的所有指针和引用都已更新。

  2. 另一种方法是在发生变化时QGraphicsScene 更新您的原生模型,以避免从头开始重新创建整个场景。例如,当用户单击删除图标时让QGraphicsScene处理删除QGraphicsItem,然后让场景更新您的原生模型以反映此更改。

  3. 另一种方法是丢弃您的本机模型,并将其QGraphicsScene与它一起QGraphicsItems用作您的模型。在场景类中实现序列化等。这避免了同步两个模型的需要。缺点是您的图形独立逻辑与QGraphicsScene您可能不想要的耦合更紧密。根据您的代码大小,这也可能需要大量工作。

我将从 1. 开始,因为根据您现有的方法,这似乎是最简单的方法。如果您仍然遇到指针和对象所有权的奇怪问题,请尝试隔离它们并询问 SO :)

于 2013-01-17T08:58:39.963 回答