Использование одной и той же модели в двух экземплярах QGraphicScene в Qt
-
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) для одного из них.Таким образом, вам не придется менять какие-либо флаги элементов.