仅使用Qt是不可能的.有
another question详细说明了这些问题.归结为:
>在QApplication上安装事件过滤器将允许您在光标位于任何应用程序窗口上时接收鼠标事件,但不在其外部.这对你的情况没有帮助.
>如果小部件使用grabMouse()抓取鼠标,它将全局接收所有鼠标事件,但与其他应用程序的交互变得不可能.
因此,您需要使用特定于平台的API来执行此操作 – 这意味着Cocoa并使用Objective C/C++编写.有一个question有很好的答案,提供我们需要的几乎所有东西,但Qt集成.
缺少的部分,如下所示,是将独立代码与Qt集成在一起.此代码显示一个空小部件,仅用于演示我们正确处理应用程序及其外部的鼠标事件.
这是一个完整的工作示例,使用Cocoa.它需要进入.mm文件;不要忘记将它添加到qmake项目文件中的OBJECTIVE_SOURCES(而不是SOURCES!).
不幸的是,没有一个函数/方法可以从NSEvent转换为QMouseEvent.最好的方法是从qnsview.mm复制并粘贴一些代码.这很不幸但是Qt平台抽象设计的结果:平台代码最终调用QWindowSystemInterface :: handleMouseEvent(….)将事件发布到应用程序.
#include
#include
#include
#include
#include
#import
QTextStream out(stdout);
class MyEventFilter : public QAbstractNativeEventFilter {
public:
bool nativeEventFilter(const QByteArray &eventType, void