在QTableView上安装事件过滤器以防止委托关闭

时间:2019-06-06 08:17:26

标签: c++ qt

我试图允许在编辑(自定义)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

似乎我的事件过滤器在事件传播给孩子之后捕获了事件,这扼杀了目的……请提出建议。

0 个答案:

没有答案