我有自定义模型子类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;
}
答案 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