QSortFilterProxyModel: For hierarchical models, the filter is applied recursively to all children. If a parent item doesn't match the filter, none of its children will be shown.
Using QSortFilterProxyModel the result is that the filter is applied on the foldes, so we've something like a root only filter. The solution is simple.. Inherits QSortFilterProxyModel and...
class QfTreeProxyModel : public QSortFilterProxyModel { public: QfTreeProxyModel (QObject *parent = 0) : QSortFilterProxyModel(parent) { setFilterCaseSensitivity(Qt::CaseInsensitive); } protected: bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { QModelIndex idx = sourceModel()->index(source_row, 0, source_parent); if (sourceModel()->hasChildren(idx)) return(true); return(QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent)); } };
Here you can find the example source code: http://th30z.netsons.org/wp-content/uploads/qfilteredtreeview.cpp
That is a neat solution, however a folder item will still be shown, even if it doesn't have any filter-matching children.
ReplyDelete