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

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

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

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

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

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

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


person Simon Hibbs    schedule 06.07.2010    source источник


Ответы (1)


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

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

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

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

person Adam W    schedule 06.07.2010
comment
Я начал с этого подхода, прежде чем понял, что могу сделать наоборот. Я предполагаю, что единственными методами AQbstractItemView, которые мне понадобятся для подкласса, являются dataChanged (), rowsInserted () и rowsAboutToBeRemoved ()? Затем соответствующим образом управляйте элементами сцены. Я ожидаю, что сохраню QPersistentModelIndexes в QGraphicsItems. Мне нравится идея QHash. Я использую PyQT, поэтому я бы использовал словарь Python, но в любом случае это хорошая оптимизация. - person Simon Hibbs; 07.07.2010
comment
@Simon: Да, я думаю, вы это поняли, в dataChanged () вам, возможно, придется дублировать часть кода из QGraphicsScene в зависимости от ваших данных и представления, но, опять же, это должно быть незначительным, если таковое имеется. - person Adam W; 07.07.2010
comment
@Simon: Поздравляю, надеюсь, разработки с QtQuick / QML и т.п. сделают это еще проще в будущем. - person Adam W; 07.07.2010
comment
Кроме того, Itemviews NG (labs.trolltech.com/blogs/category/itemviews) должен помочь и в этой области, если они когда-нибудь выберутся из лабораторий. - person Casey; 07.07.2010
comment
@SimonHibbs, добились ли вы в этом прогресса? Я создаю вьюер / редактор карт и сталкиваюсь с той же проблемой, что и ваша. У вас есть какой-нибудь код, которым вы могли бы поделиться? Это ваше полученное приложение с открытым исходным кодом? - person heltonbiker; 18.04.2016
comment
@AdamW, как эта стратегия справляется с необходимостью передавать QGraphicsItem на сцену? Не могли бы вы предложить обернуть QAbstractItemView внутри QGraphicsItem`, чтобы его можно было визуализировать? - person heltonbiker; 18.04.2016
comment
@heltonbiker Я ответил на этот вопрос почти 6 лет назад, поэтому многое могло измениться, и с тех пор я отказался от Qt. Однако, если я правильно помню, вы не хотите заключать QAbstractItemView в QGraphicsItem, вы хотите создать QGraphicsItems на основе QAbstractItemView и обновить их из dataChanged (). - person Adam W; 09.06.2016