I have derived my own model from QAbstractTableModel, including implementing Qt::ItemFlags flags ( const QModelIndex & index ).

When I display the model using QTableView, it responds as expected to the flags that I set for a given column:
eg. Qt::ItemIsEnabled allows mouse interaction with the column
Qt::ItemIsEditable allows the cell to be edited

When I connect the model to a QDataWidgetMapper, I expected the flags to similarly interact with the widgets in the mapper. eg. I would expect that the widget would be disabled if Qt::ItemIsEnabled is not set. In my testing that doesn't seem to happen.

Am I missing something here?

Or does QDataWidgetMapper completely ignore the model flags?

Example given below is a very basic model, in which flags() returns Qt::ItemIsSelectable only. In my thinking this should disable the mapped widget and not permit editing. In fact it is enabled and editable.

Any help here would be very much appreciated. Thanks in advance.

Qt Code:
  1. class myModel : public QAbstractTableModel
  2. {
  3. Q_OBJECT
  4.  
  5. public:
  6. myModel();
  7. int rowCount ( const QModelIndex & parent = QModelIndex() ) const;
  8. int columnCount ( const QModelIndex & parent = QModelIndex() ) const;
  9. QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const;
  10. bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole );
  11. QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
  12. Qt::ItemFlags flags ( const QModelIndex & index ) const;
  13. protected:
  14. QList<QString> c1;
  15. QList<QString> c2;
  16. };
  17.  
  18. int myModel::rowCount ( const QModelIndex & parent ) const
  19. {
  20. return c1.count();
  21. }
  22.  
  23.  
  24.  
  25. int myModel::columnCount ( const QModelIndex & parent ) const
  26. {
  27. return 2;
  28. }
  29.  
  30.  
  31.  
  32. QVariant myModel::data ( const QModelIndex & index, int role ) const
  33. {
  34. if ( (role != Qt::DisplayRole) && (role != Qt::EditRole) )
  35. return QVariant();
  36. return (index.column() == 0) ? QVariant(c1.at(index.row())) : QVariant(c2.at(index.row()));
  37. }
  38.  
  39.  
  40.  
  41. bool myModel::setData ( const QModelIndex & index, const QVariant & value, int role )
  42. {
  43. if (index.column() == 0)
  44. c1[index.row()]= value.toString();
  45. else
  46. c2[index.row()]= value.toString();
  47. emit dataChanged( this->index(0,0), this->index(c1.count(),1));
  48. return true;
  49. }
  50.  
  51. QVariant myModel::headerData ( int section, Qt::Orientation orientation, int role ) const
  52. {
  53. return QVariant(QString(""));
  54. }
  55.  
  56. Qt::ItemFlags myModel::flags( const QModelIndex & index ) const
  57. {
  58. return Qt::ItemIsSelectable;
  59. }
To copy to clipboard, switch view to plain text mode