如何在Qt(C ++)中搜索(过滤的)QSortFilterProxyModel?

时间:2016-03-20 20:10:25

标签: c++ qt search model qsortfilterproxymodel

我有一个工作过滤器函数(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
    }   
}

1 个答案:

答案 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_);