如何检查鼠标是否真的离开了QWidget?

时间:2015-01-18 21:52:29

标签: qt focus mouseevent qwidget

考虑一个QWidget窗口,当鼠标离开此窗口时会触发什么事件?

窗口上有QLineEdit字段,它们有完成(QCompleter)输入建议。实际目标是当鼠标离开窗口时使这样的(开放)完成符消失。这主要是因为在某些环境中,将鼠标移动到不同的窗口可能会聚焦其他窗口,但键盘事件仍然会发送到QLineEdit字段(即使其父窗口不再聚焦),这是令人困惑的。

我可以实现QWidget :: leaveEvent(QEvent * event)(在窗口中),找到当前显示的完成弹出窗口并隐藏它,关闭弹出窗口。但具有讽刺意味的是,当鼠标移动到弹出窗口时也会触发leaveEvent() - 隐藏它(使得无法单击该弹出窗口中的项目)。我猜这是有道理的,因为弹出窗口是一个不同的QWidget,即使弹出窗口是由窗口间接拥有的。

那么如何检查鼠标是否实际离开了QWidget窗口?

1 个答案:

答案 0 :(得分:2)

在派生类中重新实现QWidget::leaveEvent(QEvent *event),但首先检查rect().contains(mapFromGlobal(QCursor::pos()))是否为真。

如果没有,请不要做任何事情。 这应该过滤掉鼠标仍位于窗口小部件上的所有事件。

希望它有所帮助!