C ++ - Linux:捕获鼠标ala VirtualBox

时间:2011-03-31 17:18:50

标签: c++ linux mouse

一个人如何“捕获鼠标”(与vbox捕获鼠标的意义相同[1])

在Linux中使用C ++或C?

[1]在VBox中(基本上)当你点击一个vbox窗口时,它会捕获鼠标,因为鼠标被约束在窗口上。当按下一个键(或其他一些事件)时,鼠标可以自由地返回到其余部分。

2 个答案:

答案 0 :(得分:0)

编辑:当我写这篇文章时,我正在考虑Qt,你可能会或可能不会使用它。无论你使用什么gui框架,这样的东西都可以起作用。

似乎没有可以设置的单个QWidget属性会影响到这一点。所以你需要做的是1)启用鼠标跟踪,2)处理鼠标输入和/或焦点事件(在QWidget内),3)处理后续离开事件,当它们发生时4)将鼠标位置重置为使用QCursor :: setPos()的小部件中最近的点,这是静态的。 2)和3)将使用QWidget :: enterEvent(),QWidget :: focusInEvent()和QWidget :: leaveEvent()来处理。

如果鼠标悬停在窗口小部件上但是窗口小部件不在焦点上,我不知道是否发布了离开事件。如果没有,那么你可以跳过2)。

答案 1 :(得分:0)

由于我没有具体的答案,我想推荐你,我会做什么。

当开源应用中有一项功能时,我建议您使用它的来源。

如果挖掘或阅读不够,您可能希望使用完整的调试信息编译应用程序并在调试器下运行以查找负责有趣功能的代码段。

如果您没有去过那里,请查看以下地点:

VirtualBox - Source code organization

VirtaulBox GUI frontend sources

在像this, search for changesets with "mouse capture"

这样的chegesets中进行一些搜索

changeset 30448我看到函数调用“captureMouse”,我认为这个或类似的地方可能会跟随你到正确的代码段。

我发现的,您最感兴趣的是:

src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp 描述:“FE / Qt4-OSX:防止鼠标在捕获模式下离开窗口。” ,结帐这些功能:

void UIMouseHandler::captureMouse(ulong uScreenId)

要完成,这里是头文件:UIMouseHandler.h