У меня есть своя собственная табличная модель из QAbstractTableModel
, Это установлено на мой взгляд (подкласс от QTableView
). Внутри представления я использую класс делегата (подкласс из QItemDelegate
) для редактирования предметов.
Я хочу настроить следующее поведение: когда я закончу редактирование данных с помощью моего делегата, следующий элемент в модели (элемент в следующей строке и в том же столбце) должен стать редактируемым.
Документация говорит, что это обеспечивается QAbstractItemDelegate::EditNextItem
подсказка, которая отправляется в closeEditor()
сигнал. Но по умолчанию этот сигнал отправляется с QAbstractItemDelegate::NoHint
параметр. Проблема в том, что мне не нужно явно вызывать этот сигнал при переопределении базового QItemDelegate
виртуальные функции, такие как setModelData()
например.
В документации также говорится, что этот сигнал отправляется внутренним фильтром событий, который устанавливается на делегат элемента при вызове. QAbstractItemDelegate()
конструктор.
Как я мог предоставить свой собственный EndEditHint
в closeEditor()
сигнал?
Когда вы закончите редактирование, делегат отправит 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);
}
И кстати: Когда вы нажимаете табуляция ключ, по умолчанию QTableView
Поведение заключается в том, что текущий редактор закрыт, данные сохранены, а следующая ячейка отредактирована.
Так что, возможно, единственное, что вам нужно сделать, это просто переопределить QTableView::moveCursor()
метод.
Других решений пока нет …