在leaveEvent中知道输入了哪个QWidget

Knowing inside a leaveEvent which QWidget is entered

本文关键字:QWidget 输入 leaveEvent      更新时间:2023-10-16

我正在实现一个QDialog,当鼠标光标离开QFrame时,当另一个QWidget(一个QFrame)悬停并被破坏时,它会显示出来。我通过enterEvent和leaveEvent(在QFrame内)进行构建和销毁:

void Frame::enterEvent(QEvent *) {
    m_dialog = new Dialog(this);
}
void Frame::leaveEvent(QEvent *) {
    m_dialog->deleteLater();
}

构建对话框时,对话框会将自身移动到框架的正下方。到目前为止还不错,但是鼠标光标也必须能够转到对话框。我考虑过像这样使用underMouse():

void Frame::leaveEvent(QEvent *) {
    if (! m_dialog->underMouse()) {
        m_dialog->deleteLater();
    }
}

但问题是,在Frame::leaveEvent中,m_dialog->underMouse()始终为false,即使鼠标移到它上面。

在Frame::leaveEvent中,我怎么知道鼠标现在是在对话框上还是在其他地方?

我可以用以下方式实现它:

对话框的leaveEvent触发一个零计时器,调用"目标"小部件(光标可以在不破坏对话框的情况下移动的小部件)中的一个函数。此函数检查此小部件当前是否位于鼠标光标下。如果是这样,什么也不会发生。如果没有,对话框将被该小部件破坏。

"target"小部件的leaveEvent也是如此,它调用对话框中以相同方式通过零计时器实现的函数。