Как использовать QSortFilterProxyModel для фильтрации модели дерева, которая отображает только дочерние узлы со своими родителями? - PullRequest
4 голосов
/ 27 сентября 2011

У меня есть рабочая модель дерева, полученная из QAbstractItemModel, и я хочу отфильтровать ее, используя подкласс QSortFilterProxyModel, чтобы отображать только дочерние узлы определенных критериев.Например, у меня есть следующее дерево:

A
- B
-- C1
-- C1
-- C1
--- C2
- D
- E

Я хочу отфильтровать это дерево с условием, что узел имеет имя == C1, и отображать только узлы с C1 и их дочерние элементы следующим образом:

C1
C1
C1
- C2

У меня уже есть повторно реализованный подкласс с filterAcceptsRow (), который может частично выполнять то, что я хочу, но он все равно покажет родителя и прародителя узлов C1:

A
- B
-- C1
-- C1
-- C1
--- C2

Я думаю, этопотому что для того, чтобы дочерние узлы даже рассматривались, их родитель должен пройти тест filterAcceptsRow (), я прав?Как я могу реализовать filterAcceptRows () или другие методы, чтобы он мог делать то, что я описал?

Я задавал этот вопрос когда-то еще в qtcentre и qtforum, но не получил никакого полезного ответа.Я пытался переместить индексы подкласса QSortFilterProxyModel напрямую, используя beginMoveRows и endMoveRows внутри filterAcceptsRow (), но это просто приводит к аварийному завершению тестового приложения из-за опасного const_cast.

Ответы [ 3 ]

4 голосов
/ 28 сентября 2011

Хорошо, я нашел решение своей проблемы. Просто используйте QTreeView :: setRootIndex () с индексом B в качестве входного аргумента. Индекс B становится корневым индексом QTreeView, который скрыт, и только его дочерние элементы отображаются полностью.

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

1 голос
/ 28 сентября 2011

Я не думаю, что это возможно, используя QSortFilterProxyModel.Причина в том, что этот класс фильтрует только элементы - в меню он скрывает (или нет) некоторые элементы, основываясь на заданных критериях.То, что вы хотите сделать, это реструктурировать дерево в новое (выбрав элементы из произвольного положения в root-child).Это возможно только путем создания собственного потомка QProxyModel и самостоятельного восстановления дерева и сопоставления индексов между старым и новым деревом.

Точное описание того, как это сделать, для ответа здесь немного длинно.

0 голосов
/ 11 октября 2012

Конечно, setRootIndex является решением для этого случая, но если вы будете искать более сложные манипуляции с моделями, вы можете рассмотреть возможность использования пользовательских прокси-моделей, таких как http://lynxline.com/category/models/

...