如何在窗口小部件窗口之外接收或能够处理mouseMoveEvent?

时间:2011-12-15 12:33:29

标签: c++ qt events mouse

我正在编写Qt应用程序,当鼠标移动到屏幕中的某个区域时,它会播放淡入动画,并且只要鼠标移出相同区域,就会播放淡出动画。

我已经在堆栈溢出中找到了类似的问题,但是,它并没有完全回答我的问题。 (similar question here

如果我在应用程序中安装了一个事件过滤器,即使它在我的窗口小部件窗口之外,我是否能够看到应用程序中的所有事件?

如果没有,我知道在leaveEvent()的重新实现中有一个涉及QWidget :: grabMouse()的替代方法。但如果我这样做,我能否与我的应用程序外的任何东西进行交互?

编辑:虽然我使用的是Qt库,但我的应用程序仅用于部署到Windows。

3 个答案:

答案 0 :(得分:3)

我确定答案是肯定的,因为你的小部件之外的事件是由操作系统窗口管理器处理的(并传播到该空间中的任何应用程序上)。

但是,您可以通过调用QCursor::pos()在屏幕上的任何位置获取鼠标位置,您可以定期轮询以找出鼠标的位置。

答案 1 :(得分:2)

您可以尝试创建一个完全透明的窗口,该窗口位于您要接收鼠标事件的区域的顶部,并带有Qt::WindowStaysOnTopHintQt::FramelessWindowHintQt::ToolTip标记(最后一个)可能会阻止窗口接收焦点),Qt::WA_TranslucentBackground属性和鼠标跟踪已启用。

答案 2 :(得分:1)

如果您使用的是Windows,则可以创建global hook来接收每条鼠标消息(在鼠标指针下发送到窗口之前)。不幸的是,我不知道其他操作系统中是否存在此功能。