QItemDelegate, как предоставить свой собственный EndEditHint в сигнал closeEditor ()?

У меня есть своя собственная табличная модель из QAbstractTableModel, Это установлено на мой взгляд (подкласс от QTableView). Внутри представления я использую класс делегата (подкласс из QItemDelegate) для редактирования предметов.

Я хочу настроить следующее поведение: когда я закончу редактирование данных с помощью моего делегата, следующий элемент в модели (элемент в следующей строке и в том же столбце) должен стать редактируемым.

Документация говорит, что это обеспечивается QAbstractItemDelegate::EditNextItem подсказка, которая отправляется в closeEditor() сигнал. Но по умолчанию этот сигнал отправляется с QAbstractItemDelegate::NoHint параметр. Проблема в том, что мне не нужно явно вызывать этот сигнал при переопределении базового QItemDelegate виртуальные функции, такие как setModelData() например.

В документации также говорится, что этот сигнал отправляется внутренним фильтром событий, который устанавливается на делегат элемента при вызове. QAbstractItemDelegate() конструктор.

Как я мог предоставить свой собственный EndEditHint в closeEditor() сигнал?

2

Решение

Когда вы закончите редактирование, делегат отправит 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() метод.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]