Я работаю над отображающимся приложением и потребностью отобразить объекты данных с помощью таблицы, формы и как графические объекты в карте. Я использую PyQt, но это не действительно важно, поскольку это - спокойный вопрос не вопрос о Python.
Если бы мне только была нужна таблица, и форма просматривает, то это было бы легко, я просто использовал бы спокойную платформу Модели/Представления. Однако мне нужно представление карты, чтобы предоставить функциональности только действительно доступное использование Графической платформы Представления, которая является чрезвычайно своей собственной платформой Модели/Представления с QGraphicsScene, действующим как модель данных.
Я могу думать о двух способах сделать это. Нужно было бы запустить с авторитетной модели, разделенной на подклассы от QAbstractItemModel, связать его с подклассом QAbstractItemView и оттуда генерировать и обновить QGraphicsItems в сцене. Это выглядит ужасным хотя, потому что я не уверен, как обработать взаимодействие с пользователем с и изменения в элементах данных хотя взаимодействие с QGraphicsItems.
Другим путем я могу думать, чтобы сделать это, должен рассматривать QGraphicsScene как авторитетный источник данных, храня объект данных в .data каждого QGraphicsItem () свойство. Я затем разделил бы QAbstractItemModel на подклассы и записал бы это так, чтобы это получило доступ к данным в сцене, поскольку это - хранилище данных, другие представления затем использовали бы это в качестве своей модели. Как я распространил бы изменения в данных в сцене до модели хотя?
Какой бы ни приближаются, я беру, похоже, что существует разрыв, не обработанный платформами. В Модели/Представлении все изменения, как предполагается, внесены в модели. В Графическом Представлении все изменения, как предполагается, внесены в сцене.
Таким образом, какой подход был бы Вы выбирать (авторитетный) QAbstractItemModel-> QAbstractItemView-> QGraphicsScene или альтернативно (авторитетный) QGraphicsScene-> QAbstractItemModel-> Другие Представления. Почему Вы выбрали бы один по другой и какие глюки Вы ожидаете? Кто-либо еще должен был устранить этот разрыв между двойными платформами модели/представления QT и как Вы делали это?
QAbstractItemModel (авторитетный) -> QAbstractItemView-> QGraphicsScene
Без сомнения. Я делал это раньше, это требует небольшого дублирования (по крайней мере, некоторых, которых я не мог избежать), но ничего плохого.
Это также позволяет вам представлять ваши данные в стандартных представлениях вместе со сценой, что довольно приятно.
Мой лучший совет - сохранить QHash
от QPersistantModelIndex
до QGraphicsItem
и QGraphicsScene
в QAbstractItemView
вы создаете. Это позволяет быстро переключаться между областью модели / вида ( QModelIndex
) и областью графического представления ( QGraphicsItem
)