У меня есть древовидная модель с теоретически бесконечной глубиной и некоторым свойством «Группа».
В дополнение к стандартному представлению мне нужно показать эту модель (и поддерживать ее синхронизацию) таким образом, чтобы каждая группа становилась виртуальным родителем для всех элементов с одинаковым значением свойства.
Каков наилучший способ добиться этого с архитектурой модель / представление Qt?
Я решил подобную проблему не так давно, вставив дополнительные виртуальные «группы» при добавлении / удалении элементов в / из модели, но этот метод оказался не очень гибким, поэтому я ищу лучшее решение.
В идеале, я вижу, что это реализовано через модель QSortProxyFilter, как сейчас.
В зависимости от того, что вы хотите в качестве конечного результата:
Вы можете добиться фильтрации без необходимости реализации QAbstractProxyModel.
QSortFilterProxyModel может сортировать по роли элемента, по умолчанию Qt :: DisplayRole. Но если вы поместите свойство вашей группы в пользовательскую роль вашего элемента, то вы сможете отсортировать по этой пользовательской роли: cf:
https://doc.qt.io/qt-5/qsortfilterproxymodel.html#sortRole-prop
Это должно сделать основную работу по сортировке для конкретного представления, заказанного Группой.
Но у вас не будет узла «сворачиваемой группы». Трудно сказать, сможете ли вы справиться с аналогичной функцией с помощью пользовательского рендерера.
В противном случае сложный способ, как предлагает Феликс, реализовать пользовательский QAbstractProxyModel, который будет создавать индексы группы узлов.
Последнее решение: создайте свою собственную (базовую) модель (что-то вроде MyTree и Map<Group,Node>
и две модели Qt (по одной для каждого представления). Обновите обе модели с помощью механизма сигналов / слотов Qt при обновлении базовой модели и наоборот.
Других решений пока нет …