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
}
これは小さなテーブルで機能します。大きなテーブルに使用するとスタックが詰まります。これはすべての列で検索するのか、最初の列だけで検索しますか?私は、QStringListの値と最初の列の値を比較する必要があります。 – Engo
'sourceModel() - > index(sourceRow、0、sourceParent);'と呼ばれ、最初の列だけが比較されます。 – Felix
私は自分のコードをより速くするように最適化しました。これ以降、表示された行リストのサイズと非表示の行リストのサイズを比較します。プロキシモデルを最小のリストでフィルタリングします:) – Engo