qt相关资料
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
让model可编辑
delegate会在创建编辑器之前检查数据项是否是可编辑的。model必须得让delegate知道它的数据项是可
编辑的。这可以通过为每一个数据项返回一个正确的标记得到,在本例中,我们假设所有的数据项都是
可编辑可选择的:
Qt::ItemFlags StringListModel::flags(const QModelIndex &index) const {
if (!index.isValid())
return Qt::ItemIsEnabled;
return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; }
我们不必知道delegate执行怎样实际的编辑处理过程,我们只需提供给
delegate一个方法,delegate会使用它对model中的数据进行设置。这个特殊的函数就是setData():
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;
}
当数据被设置后,model必须得让views知道一些数据发生了变化,这可通过发射一个dataChanged() 信号实现。
因为只有一个数据项发生了变化,因此在信号中说明的变化范围只限于一个model index。
插入,删除行
在model中改变行数与列数是可能的。当然在本列中,只考虑行的情况,我们只需要重新实现插入、删除
的函数就可以了,下面应在类定义中声明:
bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex());
bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex());
既然model中的每行对应于列表中的一个string,因此,insertRows()函数在string list 中指定位置插入一个空string,
父index通常用于决定model中行列的位置,本例中只有一个单独的顶级项,困此只需要在list中插入空string。