Russian Qt Forum
Ноябрь 24, 2024, 03:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы с QAbstractTableModel  (Прочитано 2752 раз)
imironchik
Гость
« : Ноябрь 05, 2010, 14:34 »

Привет.

Реализовал я свою модель, унаследовавшись от QAbstractTableModel. Флагами разрешил редактировать только вторую колонку, хочу, чтобы первую нельзя было менять. Так вот double click по первой колонке приводит к краху приложения, перед которым идет цикл вызовов rowCOunt() и columnCount(). Не могу понять в чем проблема... Вот код:

Код:
class CorrespondenceModel
    :    public QAbstractTableModel
{
public:
    CorrespondenceModel( QObject * parent = 0 )
        :    QAbstractTableModel( parent )
    {
    }

    int rowCount( const QModelIndex & parent = QModelIndex() ) const
    {
        qDebug() << "rowCount" << m_data.size();
        Q_UNUSED( parent );
        return m_data.size();
    }

    int columnCount( const QModelIndex & parent = QModelIndex() ) const
    {
        qDebug() << "columnCount";
        Q_UNUSED( parent );
        return 2;
    }

    QVariant data( const QModelIndex & index , int role ) const
    {
        qDebug() << "data";
        if( !index.isValid() )
            return QVariant();

        if( index.row() >= m_data.size() || index.row() < 0 )
            return QVariant();

        if( role == Qt::DisplayRole )
        {
            QPair< QString, QString > pair = m_data.at( index.row() );

            if( index.column() == 0 )
                return pair.first;
            else if( index.column() == 1 )
                return pair.second;
        }

        return QVariant();
    }

    QVariant headerData( int section, Qt::Orientation orientation, int role ) const
    {
        if( role != Qt::DisplayRole )
            return QVariant();

        if( orientation == Qt::Horizontal )
        {
            switch( section )
            {
                case 0:
                    return tr( "Excel file" );

                case 1:
                    return tr( "Format" );

                default:
                    return QVariant();
            }
        }

        return QVariant();
    }

    Qt::ItemFlags flags( const QModelIndex & index ) const
    {
        qDebug() << "flags";
        if( !index.isValid() )
            return Qt::ItemIsEnabled;

        if( index.column() == 1 )
            return Qt::ItemIsEditable | Qt::ItemIsSelectable |
                Qt::ItemIsUserCheckable | Qt::ItemIsEnabled;
        else
            return Qt::ItemIsSelectable | Qt::ItemIsUserCheckable |
                Qt::ItemIsEnabled;
    }

    bool setData( const QModelIndex & index, const QVariant & value,
        int role = Qt::EditRole )
    {
        qDebug() << "setData";
        if( index.isValid() && role == Qt::EditRole )
        {
            int row = index.row();

            QPair< QString, QString > p = m_data.value( row );

            if( index.column() == 0 )
                p.first = value.toString();
            else if( index.column() == 1 )
                p.second = value.toString();
            else
                return false;

            m_data.replace( row, p );

            emit dataChanged( index, index );

            return true;
        }

        return false;
    }

    bool insertRows( int position, int rows,
        const QModelIndex & index = QModelIndex() )
    {
        qDebug() << "insertRows";
        Q_UNUSED( index );

        beginInsertRows( QModelIndex(), position, position + rows - 1 );

        for (int row = 0; row < rows; ++row )
        {
            QPair< QString, QString > pair( "", "" );
            m_data.insert( position, pair );
        }

        endInsertRows();

        return true;
    }

    bool removeRows( int position, int rows,
        const QModelIndex & index = QModelIndex() )
    {
        qDebug() << "removeRows";
        Q_UNUSED( index );

        beginRemoveRows( QModelIndex(), position, position + rows - 1 );

        for( int row = 0; row < rows; ++row )
        {
            m_data.removeAt( position );
        }

        endRemoveRows();

        return true;
    }

    void insertRow( const QString & excelFile,
        const QString & format )
    {
        qDebug() << "insertRow";
        insertRows( 0, 1 );

        setData( index( 0, 0 ), excelFile );
        setData( index( 0, 1 ), format );
    }

    QString excelFile( int row ) const
    {
        return m_data.at( row ).first;
    }

    QString format( int row ) const
    {
        return m_data.at( row ).second;
    }

private:
    //! Data of the model.
    QList< QPair< QString, QString > > m_data;
}; // class CorrespondenceModel
Записан
imironchik
Гость
« Ответ #1 : Ноябрь 05, 2010, 20:35 »

У троллей есть полезная вещица, ModelTest называется.

Итого необходимо было поправить пару методов:

Код:
int rowCount( const QModelIndex & parent = QModelIndex() ) const
{
if( parent.isValid() )
return 0;
else
return m_data.size();
}

Qt::ItemFlags flags( const QModelIndex & index ) const
{
if( !index.isValid() )
return 0;

if( index.column() == 1 )
return Qt::ItemIsEditable | Qt::ItemIsSelectable |
Qt::ItemIsUserCheckable | Qt::ItemIsEnabled;
else
return Qt::ItemIsSelectable | Qt::ItemIsUserCheckable |
Qt::ItemIsEnabled;
}
[code]
[/code]
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.099 секунд. Запросов: 20.