我有一个问题,我的自定义编辑器在将鼠标悬停在其所在的单元格上时可以正确打开,但是当鼠标离开编辑器区域时它不会可靠地关闭,从而导致当悬停尝试为正在运行的下一个单元格打开编辑器时出现错误盘旋。
我用自己的编辑器编写了自己的委托,并且想开始在悬停时编辑单元格。为此,我将以下事件过滤器添加到我的委托中:
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;
}
Run Code Online (Sandbox Code Playgroud)
虽然它editRow阻止我多次打开编辑器,从而导致错误消息edit: editing failed。
当鼠标离开编辑器时,我还会关闭编辑器(以避免打开编辑器),代码如下:
void starEditor::leaveEvent(QEvent* event) {
(void)event;
//TODO: hint top/bottom?
emit closeEditor(this, QAbstractItemDelegate::NoHint);
}
Run Code Online (Sandbox Code Playgroud)
当我快速移动鼠标时,有时仍然会收到此错误消息。在这种情况下,我看到编辑器未关闭,并且不断收到此错误消息,直到我将鼠标悬停在编辑器仍然打开的行上并再次保留它,以便触发关闭编辑器的代码。
我认为原因是编辑错过了leaveEvent. 我该如何解决这个问题?即,我如何知道我创建的编辑器createEditor仍然存在,并且需要关闭才能创建新编辑器?或者有没有一种明智的方法来可靠地关闭编辑器?