Qt – 键盘和鼠标事件透明度的顶级小部件?

我想要一个应用程序的主窗口忽略鼠标和键盘事件,将它们传递给窗口pipe理器Z顺序下的应用程序。

我看到如何让窗口小部件忽略键盘或鼠标事件,但主窗口呢?

我试图制作一个桌面小部件,总是坐在背景上,对于键盘和鼠标事件是完全不可见的。 (通过)

Qt :: X11BypassWindowManagerHint让我通过键盘传递(虽然悲哀X11特定,但现在罚款),那么如何鼠标事件?

是否有一个操作系统不可知的方式对键盘事件透明?

编辑:

这里的关键词是透明度。

我不想鼠标和键盘事件,我希望窗口pipe理器知道我根本不需要它们。 这些事件应该针对zorder下的任何应用程序。

例如,我希望能够点击我的小部件所覆盖的桌面图标,并与它们进行交互,就好像小部件不在那里一样。

在Windows上,您可以设置WS_EX_TRANSPARENT

在Qt中使用下面的代码:

包括标题,

 #if _WIN32 #include <windows.h> #endif 

并将下面的代码放入构造函数中。

 #if _WIN32 HWND hwnd = (HWND) winId(); LONG styles = GetWindowLong(hwnd, GWL_EXSTYLE); SetWindowLong(hwnd, GWL_EXSTYLE, styles | WS_EX_TRANSPARENT); #endif 

也许你想要的是

 widget->setAttribute(Qt::WA_TransparentForMouseEvents) 

? 这就是QRubberBand用来让父母处理鼠标事件的东西。 至于键盘事件,QWidget没有得到任何键盘事件,除非它已经设置了一个focusPolicy()。

 setFocusPolicy( Qt::NoFocus ); 

因此应该照顾键盘事件。

我发现以下解决scheme(在Linux上进行testing,根据@TheSHEEEP在Windows上也可以):

 setWindowFlags(windowFlags() | Qt::WindowTransparentForInput); 

它已被添加在更新的QT版本(我没有find什么时候)看到http://doc.qt.io/qt-5/qt.html

也许我在这里错过了一些东西,但是你有没有试过inheritanceQMainWindow类,并重写QWidget :: event()方法总是返回false? 如果你需要处理一些事件,你也可以在这里添加这个智能。

这种技术应该允许您检查进入应用程序的事件,并且如果需要的话忽略它们,而不必使用事件filter进行扫描。

如果这不起作用,您可以尝试通过调用QCoreApplication :: notify()将事件redirect到桌面,并将事件传递给通过调用QApplication :: desktop()获得的桌面小部件。 我不知道这是否可行,但似乎可能值得一试。

我认为,压倒一切是应该工作:

 bool YourMainWindow::event( QEvent *event ) { event ->accept(); return true; } 

这是QWidget类文档中有关event()成员函数的一些内容:

如果事件被识别,该函数返回true,否则返回false。 如果识别的事件被接受(参见QEvent ::接受),任何进一步的处理,例如事件传播到父小部件停止。

使用Qt的事件filter :他们将允许你的应用程序吃任何你指定的事件(即键盘和鼠标事件),但仍然处理其他事件,如绘画事件。

 bool FilterObject::eventFilter(QObject* object, QEvent* event) { QKeyEvent* pKeyEvent = qobject_cast<QKeyEvent*>(event); QMouseEvent* pMouseEvent = qobject_cast<QMouseEvent*>(event); if (pKeyEvent || pMouseEvent) { // eat all keyboard and mouse events return true; } return FilterObjectParent::eventFilter(object, event); }