考虑一个 QWidget 窗口,当鼠标离开该窗口时会触发什么事件?
窗口上有 QLineEdit 字段,并且它们有用于输入建议的完成器 (QCompleter)。实际目标是当鼠标离开窗口时使这样的(打开的)完成器消失。这主要是因为在某些环境中,将鼠标移动到不同的窗口上可能会聚焦于其他窗口,但键盘事件仍然会发送到 QLineEdit 字段(即使其父窗口不再聚焦),这很令人困惑。
我可以实现 QWidget::leaveEvent(QEvent *event) (在窗口中),找到当前显示的完成弹出窗口并将其隐藏,从而关闭弹出窗口。但讽刺的是,当鼠标移到该弹出窗口上时,也会触发 leftEvent() - 隐藏它(使得无法单击该弹出窗口中的项目)。我想这是有道理的,因为弹出窗口是一个不同的 QWidget,即使弹出窗口间接由窗口拥有。
那么如何检查鼠标是否确实离开了 QWidget 窗口呢?
QWidget::leaveEvent(QEvent *event)
,但首先检查 rect().contains(mapFromGlobal(QCursor::pos()))
是否为 true。
如果没有,则不执行任何操作返回。 这应该过滤掉鼠标仍在小部件上的所有事件。