Как использовать каркас Qt Model / View с каркасом Graphics View - PullRequest
15 голосов
/ 06 июля 2010

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

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

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

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

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

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

1 Ответ

11 голосов
/ 07 июля 2010

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

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

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

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

...