class CustomSortFilterProxyModel:public QSortFilterProxyModel
{
Q_OBJECT
public:
explicit CustomSortFilterProxyModel(QObject *parent = Q_NULLPTR):QSortFilterProxyModel(parent){}
~CustomSortFilterProxyModel(){}
public slots:
void inputValueChange(QString inputContent)
{
m_inputStr=inputContent;
QRegExp regExp(inputContent, Qt::CaseInsensitive);
this->setFilterRegExp(regExp);
}
// QSortFilterProxyModel interface
protected:
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
bool filter = QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
if (filter) // 若本来此节点就允许显示,则直接返回true。
{
return true;
}
else // 若此节点不允许显示,则需要判断此节点下面子节点是否有满足过滤条件的,若有,则需要显示此节点。
{
QModelIndex source_index = sourceModel()->index(source_row, 0, source_parent);
for (int i = 0; i < sourceModel()->rowCount(source_index); i++)
{
if (filterAcceptsRow(i, source_index))
{
return true;
}
}
}
return false;
}
private:
QString m_inputStr;
};
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QStandardItemModel* m_model;
CustomSortFilterProxyModel* m_sortModel;
};
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
m_model=new QStandardItemModel;
m_sortModel=new CustomSortFilterProxyModel;
m_sortModel->setSourceModel(m_model);
ui->listView->setModel(m_sortModel);
connect(ui->lineEdit,&QLineEdit::textChanged,m_sortModel,&CustomSortFilterProxyModel::inputValueChange);
for(int i=0;i<100;i++)
{
QStandardItem* _item=new QStandardItem;
_item->setText(QString("测试%1").arg(i));
m_model->insertRow(i,_item);
}
}
Widget::~Widget()
{
delete ui;
}
简单的创建一个QListView 对它的数据模型model进行显示和关闭