#ifndef TREEVIEWSORTFILTERMODEL_H
#define TREEVIEWSORTFILTERMODEL_H
#include <QObject>
#include <QSortFilterProxyModel>
#include <QRegExp>
class TreeViewSortFilterModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
TreeViewSortFilterModel(QObject *parent = 0);
protected:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const Q_DECL_OVERRIDE;
};
#endif
#include "TreeViewSortFilterModel.h"
TreeViewSortFilterModel::TreeViewSortFilterModel(QObject *parent)
: QSortFilterProxyModel(parent)
{
}
bool TreeViewSortFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
QAbstractItemModel *pModel = sourceModel();
if (NULL == pModel) return false;
{
QModelIndex source_index = sourceParent;
while (source_index.isValid())
{
bool isContains = pModel->data(source_index).toString().contains(filterRegExp());
if (isContains) return true;
source_index = sourceModel()->parent(source_index);
}
}
QModelIndex index;
bool isContains = false;
int columnCount = pModel->columnCount();
int m_filterColumn = filterKeyColumn();
for (int i = 0; i < columnCount; i++)
{
index = pModel->index(sourceRow, i, sourceParent);
if (index.column() != m_filterColumn && -1 != m_filterColumn) continue;
isContains = pModel->data(index).toString().contains(filterRegExp());
if (isContains) return true;
}
{
QModelIndex source_index = sourceModel()->index(sourceRow, 0, sourceParent);
if (!source_index.isValid())
{
return false;
}
for (int k = 0; k < sourceModel()->rowCount(source_index); k++)
{
if (filterAcceptsRow(k, source_index))
{
return true;
}
}
}
return false;
}
m_ProxyModel = new TreeViewSortFilterModel(m_treeView);
m_ProxyModel->setSourceModel(m_TreeViewModel);
m_ProxyModel->setFilterKeyColumn(0);
m_treeView->setModel(m_ProxyModel);
QRegExp regExp(filterStr, Qt::CaseInsensitive, QRegExp::FixedString);
m_ProxyModel->setFilterRegExp(regExp);
QRegExp regExp("*", Qt::CaseInsensitive, QRegExp::Wildcard);
m_ProxyModel->setFilterRegExp(regExp);