Установка фильтра событий в QTableView для предотвращения закрытия делегата - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь разрешить выбор других индексов при редактировании содержимого ячейки в (пользовательском) 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

Кажется, мой фильтр событий ловит события после того, как они уже были переданы детям, что убивает цель ... Пожалуйста, предложите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...