When trying to insert items into my QAbstractItemModel:
Qt Code:
  1. ListModel * model = new ListModel();
  2. for (int row = 0; row < 4; ++row) {
  3. for (int column = 0; column < 4; ++column) {
  4. model->insertRow(1);
  5. qDebug() << model->setData(model->index(row),QVariant::QVariant("halooo"),Qt::EditRole);
  6. qDebug() << model->data(model->index(row),Qt::EditRole);
  7. }
  8. }
To copy to clipboard, switch view to plain text mode 
Outputs:
Qt Code:
  1. false
  2. QVariant(Invalid)
  3. false
  4. QVariant(Invalid)
  5. false
  6. QVariant(Invalid)
  7. false
  8. QVariant(Invalid)
  9. false
  10. QVariant(Invalid)
  11. false
  12. QVariant(Invalid)
  13. false
  14. QVariant(Invalid)
  15. false
  16. QVariant(Invalid)
  17. false
  18. QVariant(Invalid)
  19. false
  20. QVariant(Invalid)
  21. false
  22. QVariant(Invalid)
  23. false
  24. QVariant(Invalid)
  25. false
  26. QVariant(Invalid)
  27. false
  28. QVariant(Invalid)
  29. false
  30. QVariant(Invalid)
  31. false
  32. QVariant(Invalid)
To copy to clipboard, switch view to plain text mode 

listmodel.h
Qt Code:
  1. #ifndef LISTMODEL_H
  2. #define LISTMODEL_H
  3.  
  4. #include <QAbstractListModel>
  5. #include <QStringList>
  6.  
  7. class ListModel : public QAbstractListModel
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit ListModel(QObject *parent = 0);
  12. int rowCount( const QModelIndex & parent ) const;
  13. QVariant data( const QModelIndex & index, int role /* = Qt::DisplayRole*/ ) const;
  14. Qt::ItemFlags ListModel::flags(const QModelIndex &index) const;
  15. bool setData(const QModelIndex &index,const QVariant &value, int role);
  16.  
  17. private:
  18. QStringList stringList;
  19.  
  20. signals:
  21.  
  22. public slots:
  23.  
  24. };
  25.  
  26. #endif // LISTMODEL_H
To copy to clipboard, switch view to plain text mode 

listmodel.cpp
Qt Code:
  1. #include "listmodel.h"
  2. #include <QtDebug>
  3.  
  4. ListModel::ListModel(QObject *parent) :
  5. {
  6. }
  7.  
  8. QVariant ListModel::data( const QModelIndex & index, int role /* = Qt::DisplayRole*/ ) const
  9. {
  10. // if an invalid row, return empty QVariant
  11. if (index.row() < 0 || index.row() >= 4)
  12. return QVariant();
  13.  
  14. switch( role )
  15. {
  16. case Qt::DisplayRole:
  17. case Qt::EditRole:
  18. {
  19. s = QString("row [%1]").arg( index.row() );
  20. return QVariant(s);
  21. }
  22. default:
  23. return QVariant();
  24. }
  25. }
  26.  
  27. bool ListModel::setData(const QModelIndex &index,
  28. const QVariant &value, int role)
  29. {
  30. if (index.isValid() && role == Qt::EditRole) {
  31.  
  32. stringList.replace(index.row(), value.toString());
  33. emit dataChanged(index, index);
  34. return true;
  35. }
  36. return false;
  37. }
  38.  
  39. Qt::ItemFlags ListModel::flags(const QModelIndex &index) const
  40. {
  41. if (!index.isValid())
  42. return Qt::ItemIsEnabled;
  43.  
  44. return QAbstractItemModel::flags(index) /*|Qt::ItemIsEditable*/;
  45. }
  46.  
  47. int ListModel::rowCount(const QModelIndex &parent) const
  48. {
  49. return stringList.count();
  50. }
To copy to clipboard, switch view to plain text mode 

It seems like the index passed is never valid, "index.isValid()", so it never sets the data. What's wrong here?