由于Qt没有实现移动数据的函数moveRows,若是要移动数据,可先调用beginMoveRows,再对数据进行更改,最后调用endMoveRows。移动列函数同上。
例如可重写moveRows
以下写法会导致index发生变化,若是使用QPersistentModelIndex储存过数据需注意,可以在model发出rowsMoved信号时进行处理。
bool Model::moveRows(const QModelIndex &source_parent, int source_row, int count,
const QModelIndex &destination_parent, int destination_child) {
if (beginMoveRows(source_parent, source_row, source_row + count - 1, destination_parent, destination_child)) {
blockSignals(true);
// 移动数据
for (int i = 0; i < count; i++) {
QList<QStandardItem *> from_row = takeRow(source_row); //this also removes it from the model!
beginInsertRows(QModelIndex(), destination_child + 1, destination_child + 1);
insertRow(source_row > destination_child ? destination_child : destination_child - 1, from_row);
}
blockSignals(false);
endMoveRows();
return true;
}
return false;
}
参考:https://forum.qt.io/topic/86021/qabstractitemmodel-endmoverows-invalid-index