История изменений
Исправление grondek, (текущая версия) :
Да. Можно короче:
bool FindFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
// проверим, что моделька валидная
if ( !sourceModel() )
return false;
// получим index для первого столбца проверяемой строки
QModelIndex src_index = sourceModel()->index( source_row, 0, source_parent );
// рекурсивно пробежимся по дереву.
for ( int i = 0; i < sourceModel()->rowCount( src_index ); ++i ) {
QModelIndex child_index = src_index.child( i, 0 );
QVariant c1 = child_index.sibling( child_index.row(), 1 ).data();
QVariant c2 = child_index.sibling( child_index.row(), 2 ).data();
// если есть хоть один потомок, удовлетворяющий условиям фильтра - ок!
if ( c1 == c2 || filterAcceptsRow( i, src_index ) )
return QSortFilterProxyModel::filterAcceptsRow( source_row, source_parent );
}
// если у потомки не отфильтрованы, проверим себя
QVariant c1 = src_index.sibling( src_index.row(), 1 ).data();
QVariant c2 = src_index.sibling( src_index.row(), 2 ).data();
return c1 == c2 && QSortFilterProxyModel::filterAcceptsRow( source_row, source_parent );
}
Исходная версия grondek, :
Да. Можно короче:
bool FindFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
// проверим, что моделька валидная
if ( !sourceModel() )
return false;
// получим index для первого столбца проверяемой строки
QModelIndex src_index = sourceModel()->index( source_row, 0, source_parent );
// рекурсивно пробежимся по дереву.
for ( int i = 0; i < sourceModel()->rowCount( src_index ); ++i ) {
QModelIndex child_index = src_index.child( i, 0 );
QVariant c1 = child_index.sibling( child_index.row(), 1 ).data();
QVariant c2 = child_index.sibling( child_index.row(), 2 ).data();
// если есть хоть один потомок, удовлетворяющий условиям фильтра - ок!
if ( c1 == c2 || filterAcceptsRow( i, src_index ) )
return QSortFilterProxyModel::filterAcceptsRow( source_row, source_parent );
} // если у потомки не отфильтрованы, проверим себя
QVariant c1 = src_index.sibling( src_index.row(), 1 ).data();
QVariant c2 = src_index.sibling( src_index.row(), 2 ).data();
return c1 == c2 && QSortFilterProxyModel::filterAcceptsRow( source_row, source_parent );
}