Совместное использование одной и той же модели в двух экземплярах QGraphicScene в Qt - PullRequest
1 голос
/ 13 июля 2009

У меня есть приложение, которое отображает редактор для диаграммы с использованием объекта 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 какой-либо общий вид модели между сценами? Является ли мой единственный выбор иметь ту же сцену и попытаться настроить вид? Позже кажется, что это не работает, потому что информация о выборе объектов находится в графических элементах, к которым предоставлен общий доступ, поэтому, если я отключу флаги для них, они станут доступными только для чтения в обоих представлениях. Любой совет приветствуется. Спасибо.

Ответы [ 2 ]

1 голос
/ 28 августа 2009

Если вам просто нужен интерактивный и доступный только для чтения вид вашей модели, вы можете использовать один QGraphicsScene и 2 QGraphicsView. Вам просто нужно вызвать QGraphicsView :: setInteractive (false) для одного из них. Таким образом, вам не нужно менять какие-либо флаги предметов.

0 голосов
/ 13 июля 2009

Я думаю, что вы храните QSceneItems в модельных классах. Из-за этого pScene1 и pScene2 пытаются совместно использовать не только саму модель, но и элементы сцены. Это не будет работать, потому что любой элемент сцены может быть помещен только на одну сцену в любой данный момент .

Как это исправить? Сделать модель не осведомленной о каком-либо графическом интерфейсе. Пусть он выдает уведомления об изменениях () всякий раз, когда происходит что-то интересное.

Затем позвольте каждой SimScene обернуть модель в любой QSceneItems, который он пожелает, и обработать уведомления change ().

Пример:

Модель: График, Край, Vertex
GUI SimScene, QEdge, QVertex, QSimInfo, Qbackground и так далее ...

...