Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何检查鼠标是否真的离开了QWidget?_Qt_Focus_Mouseevent_Qwidget - Fatal编程技术网

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

Qt 如何检查鼠标是否真的离开了QWidget?,qt,focus,mouseevent,qwidget,Qt,Focus,Mouseevent,Qwidget,考虑一个QWidget窗口,当鼠标离开该窗口时会触发什么事件 窗口上有QLineEdit字段,它们有用于输入建议的补全符(QCompleter)。实际的目标是当鼠标离开窗口时,使这样一个(打开的)完成符消失。这主要是因为在某些环境中,将鼠标移到另一个窗口上可能会聚焦到另一个窗口,但键盘事件仍会发送到QLineEdit字段(即使其父窗口不再聚焦),这令人困惑 我可以实现QWidget::leaveEvent(QEvent*事件)(在窗口中),找到当前显示的完成器弹出窗口并隐藏它,从而关闭弹出窗口。

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

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

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


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

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

如果没有,则不做任何事情就返回。 这将过滤掉鼠标仍在小部件上的所有事件


希望有帮助

leaveEvent
不是信号,也许你想在
leaveEvent
中实现或调用检查功能?哦,你说得对,不确定我脑子里在想什么。是的,所以在重新实现leaveEvent的开始,基本上过滤掉对leaveEvent的回调,然后清理弹出窗口。