2010-11-14 3 views
0

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

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

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

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

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

Спасибо!

ответ

0

Использование производного класса от 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 для преобразования индекса прокси в индекс модели orignal

Смежные вопросы