我有一个工作过滤器函数(filterAcceptsRow
),它根据第一列(index0)过滤分层QTreeView
。我需要连接搜索QLineEdit
,以便让用户通过(已过滤的)QTreeView
进行搜索。我不确定如何将搜索算法添加到此函数中。任何人都可以帮我搞清楚吗?搜索算法应在所有5列(index0-index4)中搜索QString
。
我的过滤功能:
bool ProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
QModelIndex index1 = sourceModel()->index(sourceRow, 1, sourceParent);
QModelIndex index2 = sourceModel()->index(sourceRow, 2, sourceParent);
QModelIndex index3 = sourceModel()->index(sourceRow, 3, sourceParent);
QModelIndex index4 = sourceModel()->index(sourceRow, 4, sourceParent);
if (m_filterEnabled)
{
foreach (const QString &row, rows)
{
if (sourceModel()->data(index0).toString().contains(row) && m_shownRow)
return true; //element should be shown
else if (sourceModel()->data(index0).toString().contains(row) && !m_shownRow)
return false; //element should NOT be shown
}
if (m_shownRow)
return false;
else
return true;
} else {
return true; //no filter -> show everything
}
}
答案 0 :(得分:2)
最好的方法是链接2个代理模型。
我为桌子制作了类似的东西,但相信对于树来说它会以同样的方式工作。
您创建的类派生自QSortFilterProxyModel
并实现filterAcceptsRow
(此处使用regexp的示例):
bool QubyxSearchFilterProxyModel::filterAcceptsRow(int sourceRow,const QModelIndex &sourceParent) const
{
for(int i = 0; i < sourceModel()->columnCount(); i ++)
{
QModelIndex index = sourceModel()->index(sourceRow, i, sourceParent);
if(sourceModel()->data(index).toString().toLower().trimmed().contains(filterRegExp()))
return true;
}
return false;
}
正则表达式,你可以设置一个处理搜索lineedit更改的插槽:
QRegExp regExp(widget->lineEditSearch->text().toLower(),Qt::CaseSensitive,QRegExp::FixedString);
searchProxyModel_->setFilterRegExp(regExp);
在树代码中:
searchProxyModel_->setSourceModel(model);
proxyModel_->setSourceModel(searchProxyModel_);