Qt::ItemFlags StringListModel::flags(const QModelIndex& index) const{
if(!index.isValid())
return Qt::ItemIsEnabled;
return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}
如果是无效的数据则返回ItemIsEnabled标记,否则在原来的标记基础上增加ItemIsEditable。
当我们修改数据时,会触发setData函数, 该函数根据项的角色为EditRole替换原来的字符串。
bool StringListModel::setData(const QModelIndex& index,
const QVariant &value, int role ){
if(index.isValid() && role == Qt::EditRole){
stringList.replace(index.row(), value.toString());
emit dataChanged(index, index);
return true;
}
return false;
}
并且发送了dataChanged,这个信号第一个参数为左上角的index,第二个参数为右下角index。
dataChanged通知View视图刷新数据,从而完成数据的修改。
另外Views显示数据时会根据data返回的数据显示,所以要将data函数的显示逻辑中添加Qt::EditRole。
QVariant StringListModel::data(const QModelIndex& index, int role) const{
if(!index.isValid()){
return QVariant();
}
if(index.row() >= stringList.size()){
return QVariant();
}
if(role == Qt::DisplayRole || role == Qt::EditRole){
return stringList.at(index.row());
}else{
return QVariant();
}
}