QT QItemDelegate,CustomEditor并在悬停

时间:2016-01-20 15:55:41

标签: c++ qt

我的问题是我的自定义编辑器在悬停其所在的单元格时正确打开,但是当鼠标离开编辑器区域时它无法可靠地关闭,当悬停尝试打开下一个单元格的编辑器时会导致错误正在徘徊。

我用自己的编辑器编写了自己的委托,并希望在悬停时开始编辑单元格。为此,我将以下事件过滤器添加到我的委托:

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中创建的编辑器仍然存在,需要在我创建新编辑器之前关闭?或者可靠地关闭编辑器是否有一种理智的方式?

0 个答案:

没有答案