Netwiz
22nd September 2009, 01:29
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.
class myModel : public QAbstractTableModel
{
Q_OBJECT
public:
myModel();
int rowCount ( const QModelIndex & parent = QModelIndex() ) const;
int columnCount ( const QModelIndex & parent = QModelIndex() ) const;
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const;
bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole );
QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
Qt::ItemFlags flags ( const QModelIndex & index ) const;
protected:
QList<QString> c1;
QList<QString> c2;
};
int myModel::rowCount ( const QModelIndex & parent ) const
{
return c1.count();
}
int myModel::columnCount ( const QModelIndex & parent ) const
{
return 2;
}
QVariant myModel::data ( const QModelIndex & index, int role ) const
{
if ( (role != Qt::DisplayRole) && (role != Qt::EditRole) )
return QVariant();
return (index.column() == 0) ? QVariant(c1.at(index.row())) : QVariant(c2.at(index.row()));
}
bool myModel::setData ( const QModelIndex & index, const QVariant & value, int role )
{
if (index.column() == 0)
c1[index.row()]= value.toString();
else
c2[index.row()]= value.toString();
emit dataChanged( this->index(0,0), this->index(c1.count(),1));
return true;
}
QVariant myModel::headerData ( int section, Qt::Orientation orientation, int role ) const
{
return QVariant(QString(""));
}
Qt::ItemFlags myModel::flags( const QModelIndex & index ) const
{
return Qt::ItemIsSelectable;
}
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.
class myModel : public QAbstractTableModel
{
Q_OBJECT
public:
myModel();
int rowCount ( const QModelIndex & parent = QModelIndex() ) const;
int columnCount ( const QModelIndex & parent = QModelIndex() ) const;
QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const;
bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole );
QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
Qt::ItemFlags flags ( const QModelIndex & index ) const;
protected:
QList<QString> c1;
QList<QString> c2;
};
int myModel::rowCount ( const QModelIndex & parent ) const
{
return c1.count();
}
int myModel::columnCount ( const QModelIndex & parent ) const
{
return 2;
}
QVariant myModel::data ( const QModelIndex & index, int role ) const
{
if ( (role != Qt::DisplayRole) && (role != Qt::EditRole) )
return QVariant();
return (index.column() == 0) ? QVariant(c1.at(index.row())) : QVariant(c2.at(index.row()));
}
bool myModel::setData ( const QModelIndex & index, const QVariant & value, int role )
{
if (index.column() == 0)
c1[index.row()]= value.toString();
else
c2[index.row()]= value.toString();
emit dataChanged( this->index(0,0), this->index(c1.count(),1));
return true;
}
QVariant myModel::headerData ( int section, Qt::Orientation orientation, int role ) const
{
return QVariant(QString(""));
}
Qt::ItemFlags myModel::flags( const QModelIndex & index ) const
{
return Qt::ItemIsSelectable;
}