我需要通过QStringList(m_shownElements)中的QString值过滤QSortFilterProxyModel。我已经创建了一些代码,但它还没有工作。我只需要显示包含QStringList中的值的行。我怎样才能使这个工作?我是否需要循环使用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?
}
}
更新代码:
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
}
答案 0 :(得分:1)
你快完成了。您所要做的就是返回true / false,具体取决于该行是否应该显示:
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
}
关于你的第二个问题:我认为没有一种简单的方法可以提高效率,如果我错了就纠正我。但是,在你花费数小时优化它之前,先试试它是否足够快。