如何判断鼠标是否真的离开了QWidget?

问题描述 投票:0回答:1

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

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

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

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

qt focus mouseevent qwidget
1个回答
4
投票

在派生类中重新实现

QWidget::leaveEvent(QEvent *event)
,但首先检查
rect().contains(mapFromGlobal(QCursor::pos()))
是否为 true。

如果没有,则不执行任何操作返回。 这应该过滤掉鼠标仍在小部件上的所有事件。

© www.soinside.com 2019 - 2024. All rights reserved.