2016-03-20 19 views
2

Ich habe eine funktionierende Filterfunktion (filterAcceptsRow), die eine hierarchische QTreeView basierend auf der ersten Spalte (index0) filtert. Ich muss eine Suche QLineEdit verbinden, um den Benutzer durch den (gefilterten) QTreeView suchen zu lassen. Ich bin nicht sicher, wie man dieser Funktion einen Suchalgorithmus hinzufügt. Kann mir jemand helfen, herauszufinden? Der Suchalgorithmus sollte in allen 5 Spalten nach einem QString suchen (index0-index4).Wie durchsucht man ein (gefiltertes) QSortFilterProxyModel in Qt (C++)?

Meine Filterfunktion:

bool ProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const 
{ 
    QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent); 
    QModelIndex index1 = sourceModel()->index(sourceRow, 1, sourceParent); 
    QModelIndex index2 = sourceModel()->index(sourceRow, 2, sourceParent); 
    QModelIndex index3 = sourceModel()->index(sourceRow, 3, sourceParent); 
    QModelIndex index4 = sourceModel()->index(sourceRow, 4, sourceParent); 

    if (m_filterEnabled) 
    { 
     foreach (const QString &row, rows) 
     { 
      if (sourceModel()->data(index0).toString().contains(row) && m_shownRow) 
       return true; //element should be shown 
      else if (sourceModel()->data(index0).toString().contains(row) && !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

2

Der beste Weg ist, um Kette 2 proxymodels.

Ich habe etwas ähnliches für die Tabelle gemacht, aber glaube, dass für Baum es auf die gleiche Weise funktioniert.

Sie Ihre Klasse von QSortFilterProxyModel abgeleitet erstellen und implementieren filterAcceptsRow (hier zB mit dem Einsatz von regexp):

bool QubyxSearchFilterProxyModel::filterAcceptsRow(int sourceRow,const QModelIndex &sourceParent) const 
{ 
    for(int i = 0; i < sourceModel()->columnCount(); i ++) 
    { 
     QModelIndex index = sourceModel()->index(sourceRow, i, sourceParent); 
     if(sourceModel()->data(index).toString().toLower().trimmed().contains(filterRegExp())) 
      return true; 
    } 

    return false; 
} 

Regexp Sie in einem Ihrer Slot einstellen können, die Suche LineEdit Griffe Wechsel:

QRegExp regExp(widget->lineEditSearch->text().toLower(),Qt::CaseSensitive,QRegExp::FixedString); 
searchProxyModel_->setFilterRegExp(regExp); 

Und in dem Baumcode:

searchProxyModel_->setSourceModel(model); 
proxyModel_->setSourceModel(searchProxyModel_); 
+0

Danke, Das hat mein Problem gelöst! :) – Engo