在 Qt 的两个 QGraphicScene 实例中共享相同的模型

发布于 2024-07-26 19:02:15 字数 590 浏览 9 评论 0原文

我有一个使用 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);

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

I have an application that displays an editor for a diagram using QGraphicsScene object. I would like to create a read only version of the same dialog but have ability for user to see both at the same time.

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

When I create 2 instances of QGraphicsScene and use addItem on the second one it removes all the items from the first one. Does Qt support any sort of sharing of model between scenes? Is my only choice to have same scene and try to customize the view? Later one doesn't seem to work because object selection information is within the graphics items being shared so if I disable flags on them they become read only in both views. Any advice is appreciated. Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

土豪 2024-08-02 19:02:15

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

If you just want an interactive and a read-only view on your model you can use a single QGraphicsScene and 2 QGraphicsViews. You just have to call QGraphicsView::setInteractive(false) on one of them. That way you don't have to change any item flags.

司马昭之心 2024-08-02 19:02:15

我认为您将 QSceneItems 存储在模型类中。 因此,pScene1 和 pScene2 不仅尝试共享模型本身,还尝试共享场景项。 这不起作用,因为任何场景项 在任何给定时刻只能放置在一个场景上

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

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

示例:

型号:
图形,
边缘,
顶点
图形用户界面
模拟场景,
Q边缘,
Q顶点,
QSimInfo,
Q背景等等...

I think that you're storing QSceneItems in model classes. Because of that pScene1 and pScene2 are trying to share not only the model itself, but also the scene items. This won't work because any scene item can be placed only on one scene at any given moment.

How to fix it? Make model not aware of any GUI. Let it issue changed() notifications whenever something interesting happens.

Then let each SimScene wrap model into whatever QSceneItems it wants, and process changed() notifications.

Example:

Model:
Graph,
Edge,
Vertex
GUI
SimScene,
QEdge,
QVertex,
QSimInfo,
Qbackground, and so on ...

跨年 2024-08-02 19:02:15

另外,您添加 pScene2 两次:

...
pView1->setScene(pScene2);
...
pView2->setScene(pScene2);

并为同一个指针分配内存两次:

QGraphicsView* pView1 = new QGraphicsView();
...
QGraphicsView* pView1 = new QGraphicsView();

Also, you add pScene2 twice:

...
pView1->setScene(pScene2);
...
pView2->setScene(pScene2);

And allocate memory for the same pointer twice:

QGraphicsView* pView1 = new QGraphicsView();
...
QGraphicsView* pView1 = new QGraphicsView();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文