我试图允许在编辑(自定义)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
似乎我的事件过滤器在事件传播给孩子之后捕获了事件,这扼杀了目的……请提出建议。