我的问题是我的自定义编辑器在悬停其所在的单元格时正确打开,但是当鼠标离开编辑器区域时它无法可靠地关闭,当悬停尝试打开下一个单元格的编辑器时会导致错误正在徘徊。
我用自己的编辑器编写了自己的委托,并希望在悬停时开始编辑单元格。为此,我将以下事件过滤器添加到我的委托:
bool starDelegate::eventFilter(QObject* watched, QEvent* event) {
switch(event->type()) {
case QEvent::MouseMove: {
QAbstractItemView* table = dynamic_cast<QAbstractItemView*>(watched->parent());
if(!table) {
return false;
}
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
QModelIndex index = table->indexAt(mouseEvent->pos());
if(index.isValid() && index.row() != editRow && index.column() == column) {
editRow = index.row();
view->edit(index);
}
} break;
case QEvent::Leave:
editRow = -1;
break;
default:;
}
return false;
}
虽然editRow
阻止我多次打开编辑器,但会导致错误消息edit: editing failed
。
当鼠标离开编辑器时我也关闭编辑器(以避免编辑器打开),使用以下代码:
void starEditor::leaveEvent(QEvent* event) {
(void)event;
//TODO: hint top/bottom?
emit closeEditor(this, QAbstractItemDelegate::NoHint);
}
当我非常快速地移动鼠标时,我仍然有时会收到此错误消息。在这种情况下,我看到编辑器没有关闭,我一直收到此错误消息,直到我将鼠标悬停在仍然打开编辑器的行上并再次保留,以便关闭编辑器的代码触发。
我认为原因是,编辑错过了leaveEvent
。我怎么能补救这个?即我怎么知道我在createEditor
中创建的编辑器仍然存在,需要在我创建新编辑器之前关闭?或者可靠地关闭编辑器是否有一种理智的方式?