Как использовать фреймворк Qt Model/View с фреймворком Graphics View

Я работаю над приложением отображения и должен отображать объекты данных, используя таблицу, форму и графические объекты на карте. Я использую PyQt, но это не очень важно, так как это вопрос Qt, а не вопрос Python.

Если бы мне нужны были только таблицы и формы, это было бы легко, я бы просто использовал Qt Model/View framework. Однако мне нужен вид карты, чтобы обеспечить функциональность, действительно доступную только с помощью Graphics View framework, которая по сути собственная структура модели / представления с QGraphicsScene, действующей в качестве модели данных.

Я могу придумать два способа сделать это. Можно было бы начать с авторитетной модели подкласса из QAbstractItemModel, связать ее с подклассом QAbstractItemView и оттуда генерировать и обновлять QGraphicsItems в сцене. Это выглядит уродливо, потому что я не уверен, как обрабатывать взаимодействие с пользователем и изменения в элементах данных, хотя взаимодействие с QGraphicsItems.

в другой способ, который я могу придумать, - это рассматривать QGraphicsScene как авторитетный источник данных, сохраняя объект данных в каждом QGraphicsItem .свойство Data. Затем я бы подкласс QAbstractItemModel и написать его так, чтобы он обращается к данным в сцене, как это хранилище данных, другие представления будут использовать это в качестве своей модели. Как бы я распространил изменения на данные в сцене до модели?

какой бы подход я ни принял, похоже, что есть пробел, не обрабатываемый интегрированные системы. В модели/представлении предполагается, что все изменения вносятся в модель. В графическом представлении предполагается, что все изменения будут внесены в сцену.

Так какой подход вы выберете помощью переопределенной QAbstractItemModel(авторитетный)->QAbstractItemView->на qgraphicsscene или на qgraphicsscene(авторитетный)->помощью переопределенной QAbstractItemModel-> "другие представления". Почему бы вам выбрать один над другим и какие проблемы вы предвидите? Кто-нибудь еще должен был преодолеть этот разрыв между двойной моделью/представлением Qt и как вы это сделали?

1 ответов


QAbstractItemModel(авторитетный) - >QAbstractItemView - >QGraphicsScene

без сомнения. Я делал это раньше, это требует немного дублирования (по крайней мере, некоторых, которых я не мог избежать), но ничего плохого.

это также позволяет вам представлять ваши данные в стандартных представлениях вместе со сценой, которая довольно приятна.

мой лучший совет-хранить QHash of QPersistantModelIndex to QGraphicsItem и QGraphicsScene на QAbstractItemView создать. Это позволяет быстро перейти между моделью / видом Земли (QModelIndex) для графического просмотра земли (QGraphicsItem)