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

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

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

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

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

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

Итак, какой подход вы бы выбрали QAbstractItemModel (авторитетный) → QAbstractItemView- > QGraphicsScene или, альтернативно, QGraphicsScene (авторитетный) → QAbstractItemModel- > Другие виды. Почему вы выбираете один за другим и какие вы ожидаете? Кто-нибудь еще должен был преодолеть этот разрыв между Qt twin model/view frameworks и как вы это сделали?

Ответы

Ответ 1

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

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

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

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