Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Simon HibbsОтветов: 1

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

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

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

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

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

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

qtpyqtpyqt4qt4qgraphicsview

Ответы

Ответ 1 · рейтинг 13 · Adam W

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы