QTreeView: фильтрация содержимого - поиск лучших практик - PullRequest
0 голосов
/ 14 ноября 2010

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

Хотя приведенный выше подход, кажется, работает нормально, мне интересно, следует ли мне повторно реализовать этоиспользуя QSortFilterProxyModel.Если это так, какие будут преимущества?

Если я перейду к использованию QSortFilterProxyModel, у меня возникнет несколько (надеюсь, небольших) вопросов:

1) Поскольку я фильтрую только по дочерним элементам верхнего уровня, мне придется повторнореализовать любой метод, который фактически выполнял сортировку, чтобы все внуки остались одни, верно?

2) В моей модели данных есть несколько пользовательских методов, которые отвечают за уникальную навигацию с помощью клавиатуры и тому подобное.Могу ли я повторно реализовать их в прокси-модели и указать им методы моей модели данных?Если да, то как мне ссылаться на модель?Кажется, я не могу найти ничего похожего на метод model () в QTreeView.

Спасибо!

1 Ответ

0 голосов
/ 05 октября 2011

Лучше использовать производный класс от QSortFilterProxyModel. Вы несете ответственность за сортировку за пределами вашего дерева.

Чтобы максимально использовать существующий код, вы можете переопределить filterAcceptsRow следующим образом

bool MySortFilterProxyModel::filterAcceptsRow(int sourceRow,
     const QModelIndex &sourceParent) const
{
    if( sourceParent.IsValid() ) return true; // Don't filter other than top level

    return QSortFilterProxyModel( sourceRow, sourceParent );
}

Для пользовательских методов вам потребуется реализовать их в прокси. Затем для навигации вам может понадобиться использовать mapToSource и mapFromSource для преобразования индекса прокси в индекс модели оригинала

...