0

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

我有一个 Qlineedit,点击它会过滤视图:

// 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;
}
4

2 回答 2

4

Qt 为您的问题提供了解决方案 - 只需使用QSortFilterProxyModel. 您将需要:

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

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

于 2013-03-13T08:51:51.973 回答
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

于 2013-03-13T23:37:39.183 回答