一般如果需要对一个视图进行关键字过滤,我们会使用QT的类QSortFilterProxyModel,将视图(view)的模型设置为这个代理类,将代理类的源模型定义为原始模型,然后定义代理模型的filterKeyColumn, filterRole, filterFixString或filterRegExp等属性后就可以实现过滤功能。如:
MyTreeModel model; QSortFilterProxyModel sfmodel; MyView view; view.setModel(&sfmodel); sfmodel.setSourceModel(&model); sfmodel.setFilterKeyColumn(0); // optional sfmodel.setFilterRole(Qt::DisplayRole); // default, optional sfmodel.setFilterFixedString("keyword"); sfmodel.setFilterRegExp("[hH]ello");
// \reimp bool MyFilterProxyModel::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const { QModelIndex source_index = sourceModel()->index(source_row, 0, source_parent); if (sourceModel()->rowCount(source_index)>0) return true; else return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); }
// \reimp bool MyFilterProxyModel::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const { bool filter = QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); if (filter) { return true; } else { // check all decendant's QModelIndex source_index = sourceModel()->index(source_row, 0, source_parent); for (int k=0; k<sourceModel()->rowCount(source_index); k++) { if (filterAcceptsRow(k, source_index)) { return true; } } } return false; }按照这样的做法,就可以达到一个比较理想的过滤效果。