【问题标题】:How to check if the mouse has really left the QWidget?如何检查鼠标是否真的离开了 QWidget?
【发布时间】:2015-01-18 21:52:28
【问题描述】:

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

该窗口上有 QLineEdit 字段,并且它们具有用于输入建议的完成程序 (QCompleter)。实际目标是在鼠标离开窗口时使这样的(打开的)完成程序消失。这主要是因为在某些环境中,将鼠标移到不同的窗口上可能会聚焦到另一个窗口,但键盘事件仍会发送到 QLineEdit 字段(即使其父窗口不再聚焦),这会造成混淆。

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

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

【问题讨论】:

    标签: qt focus mouseevent qwidget


    【解决方案1】:

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

    如果不是,则不做任何事情返回。 这应该会过滤掉鼠标仍在您的小部件上的所有事件。

    希望对你有帮助!

    【讨论】:

    • leaveEvent 不是信号,可能你是想实现或者调用leaveEvent里面的检查函数?
    • 哦,你是对的,不知道我脑子里在想什么。是的,所以基本上在你的 leaveEvent 重新实现开始时过滤出对 leaveEvent 的回调,然后清理你的弹出窗口。
    猜你喜欢
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    相关资源
    最近更新 更多