![]() |
|
|
![]()
|
|
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Есть QGraphicsScene, есть QGraphicsView. Теперь нужно еще чтобы элементы сцены (а именно надписи) отображались в QTableView. Как это правильней сделать - ума не приложу. Просто не хочется дублировать эл-ты в QTableWidget.
При этом нужно как сохранить двустороннюю связь-соответствие: элемент сцены <-> строка в таблице, т.е. чтоб можно было обратившись строке таблицы идентифицировать (перейти к) QGraphicsItem на сцене и наоборот. Как-то можно без костылей? без новых сущностей Это сообщение отредактировал(а) wowka19 - 30.4.2014, 22:49 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Нужно создать класс SceneTableModel, который должен отслеживать удаление и добавление итемов на сцену. Он может содержать у себя, например, QList<QGraphicsItem*> - в зависимости от надобности, либо все итемы на сцене, либо только QGraphicsTextItem и QGraphicsSimpleTextItem и собственные итемы, содержащие текст. Причем использовать собственные итемы для текста удобнее, т.к. можно добавить собственные сигналы на их изменение, которых нет у стандартных.
|
|||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Насколько я понимаю SceneTableModel должен наследовать Qt-шную модель, которая потом присоединится к QGraphicsView. Так?
Если да, то можно подробнее? |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
|
|||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Спасибо. Хорошо, есть у меня SceneListModel со сценой и списком указателей на итемы. Я реализую методы работы с ними (добавить/удалить/...) но как мне идентифицировать итемы в сцене и списке? сравнивать адреса?
А может можно как-то обойтись без списка итемов? ведь QGraphicsScene - это по сути тот же самый контейнер. Вот только как идентифицировать в нем итемы? С каким методом модели нужно работать, чтобы известить вид об изменении модели (при вставке/удалении строки)? Это сообщение отредактировал(а) wowka19 - 3.5.2014, 08:29 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Список - для ускорения работы. Кроме того, в списке итемы будут лежать в том порядке, какой тебе нужен - он не обязательно будет такой, какой на сцене, при изменениях на сцене желательно сохранять порядок в списке не изменившихся итемов. В списке лежат указатели на итемы, сами итемы принадлежат сцене - так что дублирование минимально.
по возможности, место emit dataChaged() лучше делать emit rows{AboutToBe}{Inserted/Removed/Moved}() и т.д. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
У класса QGraphicsScene есть метод items() - он возвращает список всех итемов на сцене. Если его скорость и порядок итемов тебя устраивает, можешь не хранить копию списка итемов у себя.
|
|||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
- извини, не понял
и предыдущий вопрос:
т.е. вот я добавил на сцену итем и добавил указатель на него в список. Теперь как известить модель или вид (не знаю что именно) об изменениях? Это сообщение отредактировал(а) wowka19 - 4.5.2014, 13:00 |
|||
|
||||
| math64 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Нормально при вставке строк модель должна вызывать
emit rowsAboutToBeInserted() а затем emit rowsInserted() аналогично при удалении и перемещении. Но эти сигналы private, поэтому вместо них нужно вызывать
Но если с моделью произошли сложные изменения, вызывается
но при этом будет потеряно выделение. Если ты используешь собственные итемы, можно создать свой производный класс сцены, в котором добавить свои сигналы при добавлении, удалении, и перемещении итемов - в обычной сцене этих сигналов нет, приходится довольствоваться сигналом changed() - который вызывается чаще и не позволяет различать эти события. Другой способ - в том месте кода, где ты добавляешь итемы на сцену, после этого нужно вызвать свой метод модели, вызывающий соответствующие emit. Это сообщение отредактировал(а) math64 - 4.5.2014, 15:08 |
||||
|
|||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |