2013-03-12 25 views
0

我有一個工作Qtableview自定義模型子類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; 
} 

回答

4

Qt擁有你的問題的解決方案 - 只需使用QSortFilterProxyModel。你將需要:

  • 繼承它,寫自己的過濾功能(filterAccpetsRow
  • 代理的原始模型,通過過濾一個
  • 附加過濾模型視圖
  • 使用QSortFilterProxyModel::mapToSource()到指標之間的轉換在過濾和原始模型。

這允許您只有一個源數據模型擁有多個視圖,每個視圖可能有不同的過濾器。

+0

THX但我居然發現一個漂亮的simplier方式.. – PathOfNeo 2013-03-13 23:31:38

+0

你需要對每一個使用mapToSource()在原始視圖代碼中調用'currentIndex()'還是有更巧妙的方式來映射索引? – Prikers 2017-12-13 10:47:39

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低谷迴歸:迴歸m_lstIntern [IDX] .nClientId

+0

對於每個索引查找,平均比您的列表平均減少了一半。如果您不想執行QSortFilterProxyModel路由,則在構建將過濾索引映射到未過濾索引的過濾集時,可以填充QMap 。我想這需要取決於這個函數需要被調用的頻率。 – darron 2013-03-14 00:38:40

+0

你是對的,但是我是模型視圖編程和Qt的新手,因爲這只是我在C++/Qt中工作的第二個更大的項目,沒有時間投資研究。然而,我的實現工作,解決了這個問題,並在視圖中的4000行,篩選到一些項目添加到最後我沒有注意到任何延遲,它是相當即時。感謝哥們,我已經給了你點。我應該檢查你的awnser是否接受或不? – PathOfNeo 2013-03-14 15:36:26

+0

QSortFilterProxyModel :: mapToSource聽起來更好,並且有好處。但我現在不能倒退,需要向前推進。 – PathOfNeo 2013-03-14 15:39:13