2016-03-20 6 views
1

QStringList(m_shownElements)からQString値でQSortFilterProxyModelをフィルタリングする必要があります。私はいくつかのコードを作成しましたが、まだ動作しません。 QStringListの値を含む行のみを表示する必要があります。これをどうやって動かすことができますか? QStringListをループする必要がありますか、それとも良い方法がありますか?QStringListを使用してQSortFilterProxyModelをフィルタリングする方法は?

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

あなたほぼ完了します。 、私はそれがより効率的にする簡単な方法があるとは思わない:

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 
} 

そして、あなたの2番目の質問について:あなたがしなければならないのは、行が表示すべきか否かに応じて、真/偽を返すです私が間違っていれば私を修正してください。しかし、これを最適化するのに数時間を費やす前に、最初に十分速いかどうか試してみてください。

+0

これは小さなテーブルで機能します。大きなテーブルに使用するとスタックが詰まります。これはすべての列で検索するのか、最初の列だけで検索しますか?私は、QStringListの値と最初の列の値を比較する必要があります。 – Engo

+1

'sourceModel() - > index(sourceRow、0、sourceParent);'と呼ばれ、最初の列だけが比較されます。 – Felix

+0

私は自分のコードをより速くするように最適化しました。これ以降、表示された行リストのサイズと非表示の行リストのサイズを比較します。プロキシモデルを最小のリストでフィルタリングします:) – Engo

関連する問題