Как создавать искусственные узлы в QABSTRACTITEMMODEL для QTREEVIEW
-
24-09-2019 - |
Вопрос
Мой вопрос о 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 и комментариев :
Если ваша карта должна быть изменена, используйте ее в качестве базовой структуры в своем собственном классе. Если вы не можете хранить ссылку на вашу карту, потому что время жизни модели может превышать карту, используйте умные указатели, чтобы убедиться, что это не произошло.