Использование одной и той же модели в двух экземплярах QGraphicScene в Qt

StackOverflow https://stackoverflow.com/questions/1120129

  •  13-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

Пример:

Модель: График, край, вершина
графический интерфейсSimscene, QEDGE, QVertex, Qsiminfo, Qbackground и так далее ...

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top