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
}
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
Sie haben 'sourceModel() -> index (sourceRow, 0, sourceParent);' - so wird nur die erste Spalte verglichen. – Felix
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