Как создавать искусственные узлы в QABSTRACTITEMMODEL для QTREEVIEW

StackOverflow https://stackoverflow.com/questions/2176040

Вопрос

Мой вопрос о Qt и его QABSTRACTITEMMODEL.

У меня есть карта строк и удваивает (std::map<stringclass, double>) который я хотел бы представить в виджете QT. Пока я мог бы использовать Qtableview. Для этого я хотел бы использовать тот факт, что ключи карты имеют форму »abc.def.ghi«Где могут быть несколько строк, которые могут начать с»abc.def«И даже больше начнутся с»abc".

Поэтому я хотел бы настроить модель данных деревьев, чтобы представить предметы в Qtreeview. подобно

(-) abc
    |--(-)def      
          |--ghi    3.1415
          |--jkl    42.0815
    |--(+)pqr
    |--(+)xyz

Ключи моего std::map Листья дерева, где все остальные узлы будут временными и влюбленными конструкциями для поддержки складывания для удобства пользователя.

К сожалению, методы rowCount, index, columnCount, а также data есть Const-модификаторы, поэтому я не могу просто настроить структуру вспомогательных данных для заголовков внутри моих QABSTRACTITEMMODEL Дериватное и изменение этой структуры данных там.

Какая была бы лучшая практика для этого? Должен ли я настроить другой классный слой между моим std::map и то QABSTRACTITEMMODEL Или есть ли умнее способ сделать это?


Редактировать 1: std::map может измениться, пока Qtreeview. Показан и используется, поэтому вспомогательные узлы могут быть выброшены и реконструированы. Мое предположение в том, что лучший способ справиться с этим - реструктурировать QABSTRACTITEMMODEL - или я должен просто выбрасывать эту модель и назначить недавно построенный на Qtreeview.? В этом случае я мог настроить все узлы внутри конструктора, не будучи беспокоиться со стороны постоянного метода, я думаю.

Это было полезно?

Решение

Я бы разобрал карту и создаю структуру данных деревьев на основе этого. Убедитесь, что вы синхронизируете модель, когда вы меняете карту. Если этот шаг синхронизации становится слишком сложным, вы можете удерживать данные в структуре дерева с начала и преобразовать в карту при необходимости.

Разборка карты на мухе в модели функции модели кажется мне плохой идеей, вы бы хотели, чтобы эти функции были как можно быстрее.

Другие советы

Я не вижу, как Const-модификаторы действительно будут проблемой.

Какие члены вашего QAbstractItemModel дериват, вы хотите изменить, когда rowCount, index, columnCount а также data Способы называются? Вы можете очень хорошо хранить ссылку на вашу карту и вычислить все от него. Не нужно модифицировать свою карту, чтобы извлечь необходимую информацию (насколько я могу сказать!).

Редактировать после редактирования1 и комментариев :
Если ваша карта должна быть изменена, используйте ее в качестве базовой структуры в своем собственном классе. Если вы не можете хранить ссылку на вашу карту, потому что время жизни модели может превышать карту, используйте умные указатели, чтобы убедиться, что это не произошло.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top