2016-03-20 22 views
1

Ich muss ein QSortFilterProxyModel durch QString-Werte aus einer QStringList (m_shownElements) filtern. Ich habe einen Code erstellt, aber es funktioniert noch nicht. Ich muss nur die Zeilen anzeigen, die die Werte aus der QStringList enthalten. Wie kann ich das funktionieren lassen? Muss ich die QStringList durchlaufen oder gibt es einen besseren Weg?Wie filtere ich QSortFilterProxyModel mit QStringList?

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? 
     } 
} 

AKTUALISIERT Code:

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 
} 

Antwort

1

Ihre fast fertig. Alles, was Sie tun müssen, ist return true/false je nachdem, ob Show der Reihe sein sollte oder nicht:

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 
} 

Und Ihre zweite Frage zu: Ich glaube nicht, dass es eine einfache Möglichkeit, ist es effizienter zu machen, korrigiere mich, wenn ich falsch liege. Aber bevor Sie Stunden damit verbringen, dies zu optimieren, probieren Sie zuerst aus, ob es schnell genug ist.

+0

Dies funktioniert für einen kleinen Tabellen. Es bleibt bei großen Tabellen stecken. Sucht dies in allen Spalten oder nur in der ersten? Ich muss nur die Werte aus der QStringList mit den ersten Spaltenwerten vergleichen ... – Engo

+1

Sie haben 'sourceModel() -> index (sourceRow, 0, sourceParent);' - so wird nur die erste Spalte verglichen. – Felix

+0

Ich habe meinen Code optimiert, um es schneller zu machen. Von nun an wird die Größe der angezeigten Zeilenliste mit der Größe der Liste verdeckter Zeilen verglichen. Es wird das Proxy-Modell nach der kleinsten Liste filtern :) – Engo

Verwandte Themen