完成编辑后,委托会发送closeEditor()
带有SubmitModelCache
提示的信号。您必须保持此行为才能正确更新模型。
要在提交上一次编辑的数据后立即在下一个单元格中打开编辑器,您可以重新实现,但我发现重新实现该方法QItemDelegate::eventFilter()
要容易得多:QAbstractItemView::closeEditor()
void CMyTableView::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint)
{
QTableView::closeEditor(editor, hint);
QModelIndex index = moveCursor(MoveNext, Qt::NoModifier);
if (!index.isValid())
return;
QPersistentModelIndex persistent(index);
selectionModel()->setCurrentIndex(persistent, flags);
// currentChanged signal would have already started editing
if (index.flags() & Qt::ItemIsEditable && (!(editTriggers() & QAbstractItemView::CurrentChanged)))
edit(persistent);
}
更简单的解决方案是(我不确定,但绝对值得一试):
void CMyTableView::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint)
{
QTableView::closeEditor(editor, hint);
QTableView::closeEditor(nullptr, QAbstractItemDelegate::EditNextItem);
}
该moveCursor()
方法返回下一列和同一行的索引。如果要更改此行为,请重新实现它:
QModelIndex CMyTableView::moveCursor(CursorAction action, Qt::KeyboardModifiers modifiers)
{
if (action == QAbstractItemView::MoveNext)
action = QAbstractItemView::MoveDown;
else if (action == QAbstractItemView::MovePrevious)
action = QAbstractItemView::MoveUp;
// Next row, same column.
return QTableView::moveCursor(action, modifiers);
}
顺便说一句:当您按下Tab键时,默认QTableView
行为是关闭当前编辑器,保存数据并编辑下一个单元格。
因此,也许您唯一需要做的就是重新实现该QTableView::moveCursor()
方法。