Название: Проблемы с QAbstractTableModel
Отправлено: 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
Название: Re: Проблемы с QAbstractTableModel
Отправлено: imironchik от Ноябрь 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]
|