& quot; группировать по & quot; модель прокси

У меня есть древовидная модель с теоретически бесконечной глубиной и некоторым свойством «Группа».

оригинальный вид

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

введите описание изображения здесь

Каков наилучший способ добиться этого с архитектурой модель / представление Qt?

Я решил подобную проблему не так давно, вставив дополнительные виртуальные «группы» при добавлении / удалении элементов в / из модели, но этот метод оказался не очень гибким, поэтому я ищу лучшее решение.

В идеале, я вижу, что это реализовано через модель QSortProxyFilter, как сейчас.

2

Решение

В зависимости от того, что вы хотите в качестве конечного результата:

  • Вы можете добиться фильтрации без необходимости реализации QAbstractProxyModel.

    QSortFilterProxyModel может сортировать по роли элемента, по умолчанию Qt :: DisplayRole. Но если вы поместите свойство вашей группы в пользовательскую роль вашего элемента, то вы сможете отсортировать по этой пользовательской роли: cf:
    https://doc.qt.io/qt-5/qsortfilterproxymodel.html#sortRole-prop

    Это должно сделать основную работу по сортировке для конкретного представления, заказанного Группой.

    Но у вас не будет узла «сворачиваемой группы». Трудно сказать, сможете ли вы справиться с аналогичной функцией с помощью пользовательского рендерера.

  • В противном случае сложный способ, как предлагает Феликс, реализовать пользовательский QAbstractProxyModel, который будет создавать индексы группы узлов.

  • Последнее решение: создайте свою собственную (базовую) модель (что-то вроде MyTree и Map<Group,Node> и две модели Qt (по одной для каждого представления). Обновите обе модели с помощью механизма сигналов / слотов Qt при обновлении базовой модели и наоборот.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]