Я пытаюсь разрешить выбор других индексов при редактировании содержимого ячейки в (пользовательском) QTableView
. Мой QTableView
использует пользовательский делегат.
Чтобы сделать это, поскольку нажатие на другую ячейку приводит к тому, что делегат закрывает свой редактор, я попытался добавить фильтр событий в свой QTableView
.
// Constructor
viewport()->installEventFilter(this);
bool Table::eventFilter(QObject *obj, QEvent *ev)
{
auto mouseEvent = dynamic_cast<QMouseEvent*>(ev);
if (!mouseEvent)
return false;
if (mouseEvent->type() == QEvent::MouseMove)
return false;
// editing_ is a state attribute that describes whether the user is editing a cell
if (editing_)
{
if (mouseEvent->button() == Qt::MouseButton::LeftButton)
{
selectedCell = model()->data(indexAt(mouseEvent->pos()), Qt::UserRole).value<SpreadsheetCell*>();
qDebug() << "User selected" << selectedCell->id();
return true;
}
}
}
К сожалению, все происходит не в правильном порядке, и я могу поймать событие только после , редактор был закрыт. См:
void MyDelegate::commitAndCloseEditor()
{
// ...
qDebug() << "Closing editor";
// ...
}
Мой отладочный вывод:
Creating editor
User selected "D4" <- This is triggered when the editor has just been opened, not when the editor is closing
Closing editor
Кажется, мой фильтр событий ловит события после того, как они уже были переданы детям, что убивает цель ... Пожалуйста, предложите.