2009-07-13 26 views
1

我有一个应用程序显示使用QGraphicsScene对象的图的编辑器。我想创建同一个对话框的只读​​版本,但有能力让用户同时看到两者。在Qt中的两个QGraphicScene实例中共享相同的模型

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); 

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

回答

0

我认为你正在模型类中存储QSceneItems。因为pScene1和pScene2不仅要共享模型本身,还要共享场景项目。这将不起作用,因为任何场景项目can be placed only on one scene at any given moment

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

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

实施例:

型号: 格拉夫, 边缘, 顶点
GUI SimScene, QEdge, QVertex, QSimInfo, Qbackground,等等...

+0

你是对的。现有的系统具有作为GUI项目的模型项目,这就是为什么当第二个场景被添加到第一个场景时,它们最终被移除的原因。我会尝试分离它们。谢谢。 – 2009-07-13 18:22:28

1

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

相关问题