LINUX.ORG.RU

История изменений

Исправление 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 );                                                                                                                       
}