Привет.
Реализовал я свою модель, унаследовавшись от 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