简介
通常我们使用QSortFilterProxyModel过滤数据时,只会过滤树的父节点,符合条件的子节点不会被显示出来,因此我们需要继承QSortFilterProxyModel,重写filterAcceptsRow函数可以实现符合条件的子节点也显示出来。
.h
#include <QSortFilterProxyModel>
class SelectFileSortFilterProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
explicit SelectFileSortFilterProxyModel(QObject *parent = nullptr);
~SelectFileSortFilterProxyModel() = default;
protected:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
};
.cpp
#include "SelectFileSortFilterProxyModel.h"
SelectFileSortFilterProxyModel::SelectFileSortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent)
{
}
bool SelectFileSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
bool relust = QSortFilterProxyModel::filterAcceptsRow(source_row,source_parent);
if(relust)
{ //本来就符合条件直接返回
return true;
}
else
{ //若节点不符合判断条件,判断其下是否有子节点,若有则需要显示
//可根据需求自行修改下面的判断内容
QModelIndex source_index = sourceModel()->index(source_row, 0, source_parent);
if(sourceModel()->rowCount(source_index)>0)
{
return true;
}
else
{
return false;
}
}
return relust;
}
用法:
//新建排序model
m_sortmodel = new SelectFileSortFilterProxyModel(this);
//将model设置到treeview中
ui->treeView->setModel(m_sortmodel);
//新建数据model
m_model = new SelectFileModel;
//将数据model设置到过滤model中
m_sortmodel->setSourceModel(m_model);
效果: