1

我有一个使用 QGraphicsScene 对象显示图表编辑器的应用程序。我想创建同一个对话框的只读​​版本,但用户可以同时看到这两个版本。

SimScene* pScene1 = new SimScene(model);  // adds model to scene
SimScene* pScene2 = new SimScene(model);  // adds model to scene
QGraphicsView* pView1 = new QGraphicsView();
pView1->setScene(pScene2);
QGraphicsView* pView1 = new QGraphicsView();
pView2->setScene(pScene2);

当我创建 2 个 QGraphicsScene 实例并在第二个实例上使用 addItem 时,它会从第一个实例中删除所有项目。Qt 是否支持场景之间的任何类型的模型共享?我唯一的选择是拥有相同的场景并尝试自定义视图吗?后来的一个似乎不起作用,因为对象选择信息在共享的图形项中,所以如果我禁用它们上的标志,它们在两个视图中都变为只读。任何建议表示赞赏。谢谢。

4

3 回答 3

1

如果您只想要模型上的交互式和只读视图,您可以使用单个 QGraphicsScene 和 2 个 QGraphicsViews。您只需要在其中一个上调用 QGraphicsView::setInteractive(false) 即可。这样您就不必更改任何项目标志。

于 2009-08-28T19:08:03.943 回答
0

我认为您将 QSceneItems 存储在模型类中。因为 pScene1 和 pScene2 不仅试图共享模型本身,还试图共享场景项目。这是行不通的,因为任何场景项目在任何给定时刻都只能放置在一个场景上

如何解决?使模型不知道任何 GUI。每当发生有趣的事情时,让它发出 changed() 通知。

然后让每个 SimScene 将模型包装到它想要的任何 QSceneItems 中,并处理 changed() 通知。

例子:

模型: Graph、Edge、Vertex
GUI SimScene、QEdge、QVertex、QSimInfo、Qbackground等...

于 2009-07-13T15:49:26.457 回答
0

此外,您添加 pScene2 两次:

...
pView1->setScene(pScene2);
...
pView2->setScene(pScene2);
于 2021-06-11T12:06:26.207 回答