过滤集上的Qtableview操作

时间:2013-03-12 16:55:32

标签: qt

我有自定义模型子类QAbstractTableModel和QAbstractItemModel的工作Qtableview。

我有一个Qlineedit,onclicked它将过滤视图:

// model.cpp setFilter(QString strFilter)函数通过我的实习生QList(此Qlist实际上附加到模型)进行搜索,如果匹配,则找到:m_filterSet.insert(i);

这一切都很棒。问题是,我对tableview(插入行,删除行..)的CRUD操作也很有用!但是当从过滤的集合中选择一行时,我需要以某种方式知道我的QList中的哪个位置来自过滤集合(QSet)中的所选行。

ui.myView->selectionModel()->currentIndex().row();

显而易见的是给出了当前视图的错误索引。

我如何以某种方式从QSet中的选定行中提取值(int)? 因为当我将此函数添加到模型时:

foreach (const int &value, m_filterSet)
        qDebug() << value;

它已成功打印出所有i值,例如:3410,3411,3412(这些是我的客户ID)

如果我可以在Qset中为所选行提取此ID,我可以编写一个函数来迭代我的实习生QList,并找到匹配,可以这么说:

if(m_Intern[i].nClientID == nId){   // nId = value inside Qset for selected row in view
    return nIdx;
}

2 个答案:

答案 0 :(得分:4)

Qt为您的问题提供了解决方案 - 只需使用QSortFilterProxyModel即可。你需要:

  • 对其进行子类化并编写自己的过滤函数(filterAccpetsRow
  • 通过过滤一个
  • 代理原始模型
  • 将过滤模型附加到视图
  • 使用QSortFilterProxyModel::mapToSource()在过滤模型和原始模型中的索引之间进行转换。

这允许您只有一个源数据模型有多个视图,每个视图可能有不同的过滤器。

答案 1 :(得分:0)

经过一段时间的思考,我解决了它,我只需要在我的模型中实现另一个函数:

int myClass::screenIndex2DataIndex(int nIdxScreen)
{
   if(m_bUseFilter)
    {
        int nIdx =-1;
        for(int i=0;i<m_lstIntern.size();i++)
        {
            if(m_filterSet.contains(i))
            {
                nIdx++;
                if(nIdx == nIdxScreen){
                    return i;   
                }
            }
        }
        return -1; //not found
    }
    else{
        return nIdxScreen;
    }
}

通过这种方式,我可以找到过滤视图的当前索引,它位于我的实习列表中。

在此之后很容易通过返回获取我的nClientID:return m_lstIntern [idx] .nClientId