Привязка модели Qt к существующей структуре данных - PullRequest
3 голосов
/ 12 февраля 2010

У меня есть древовидная полиморфная структура данных, где узлы являются экземплярами класса Node (реализованного мной) или любого его подкласса. Мое приложение интенсивно использует Boost, и узлы фактически представлены типом boost :: shared_ptr, а не Node*.

Теперь я хочу создать модель Qt, чтобы обернуть мою древовидную структуру данных. Поэтому мне нужен способ связать любой модельный индекс с узлом в моей внутренней структуре данных. И тут возникает проблема:

Qt поддерживает два способа сделать это:

Первый:

QModelIndex QAbstractItemModel::createIndex ( int row, int column, void * ptr = 0 ) const

Создает модельный индекс для данного строка и столбец с внутренним указатель ptr.

И второй:

QModelIndex QAbstractItemModel::createIndex ( int row, int column, quint32 id ) const

Создает модельный индекс для данного строка и столбец с внутренним идентификатор, идентификатор.

Хорошо, а как именно я должен связать узел в моем случае? Нет возможности связать shared_ptr с модельным индексом ... Да, я знаю, я могу получить необработанный указатель от моего shared_ptr и поставить его на CreateIndex(), но он плохо пахнет - мне кажется слишком небезопасным.

Есть идеи?

Кстати, я чувствую, что в целом интеграция Boost / Qt, кажется, не тривиальна, по крайней мере, в области управления памятью.

10х много.

1 Ответ

2 голосов
/ 12 февраля 2010

Если вы хотите выполнить простую ассоциацию без передачи необработанного указателя, поместите общую память в контейнер и передайте значение идентификатора для этого элемента контейнера в индекс модели. Например, вы могли бы создать объявить

QMap< quint32, boost::shared_ptr< Foo > > index_map;

и используйте это. Вы должны быть осторожны, чтобы не дублировать идентификаторы для существующих указателей, возможно. Это кажется мне слишком сложным ....

Вы также можете просто сохранить список указателей (чтобы обеспечить постоянную доступность по мере необходимости), а затем использовать фактический адрес указателя в QModelIndex. Это, вероятно, то, что я бы сделал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...