如何使用QStringList过滤QSortFilterProxyModel?

时间:2016-03-20 12:42:28

标签: c++ qt model qsortfilterproxymodel

我需要通过QStringList(m_shownElements)中的QString值过滤QSortFilterProxyModel。我已经创建了一些代码,但它还没有工作。我只需要显示包含QStringList中的值的行。我怎样才能使这个工作?我是否需要循环使用QStringList或者有更好的方法吗?

bool ProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
    if (m_filterEnabled)
    {
        QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
        for (int i = 0; i < m_shownElements.size(); i++)
        {
            if (sourceModel()->data(index0).toString().contains(m_shownElements[i]))
            // What now?
        }
} 

更新代码:

bool ProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
    if (m_filterEnabled)
    {
        QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
        for (int i = 0; i < m_rows.size(); i++)
        {
            if (sourceModel()->data(index0).toString().contains(m_rows[i]) && m_shownRow)
                return true; //element should be shown
            else if (sourceModel()->data(index0).toString().contains(m_rows[i]) && !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 :(得分:1)

你快完成了。您所要做的就是返回true / false,具体取决于该行是否应该显示:

bool ProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{
    if (m_filterEnabled)
    {
        QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
        for (int i = 0; i < m_shownElements.size(); i++)
        {
            if (sourceModel()->data(index0).toString().contains(m_shownElements[i]))
                return true;//element should be shown
        }

        return false;//not in the list -> don't show
    } else
        return true;//no filter -> show everything
} 

关于你的第二个问题:我认为没有一种简单的方法可以提高效率,如果我错了就纠正我。但是,在你花费数小时优化它之前,先试试它是否足够快。