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

dar*_*ron 40 qt desktop-application event-handling

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

我看到如何使窗口小部件忽略键盘或鼠标事件,但主窗口怎么样?

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

Qt :: X11BypassWindowManagerHint让我通过键盘传递(虽然很遗憾X11具体,但现在很好),那么鼠标事件呢?

是否存在与操作系统无关的方式对键盘事件透明?

编辑:

这里的关键词是透明度.

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

例如,我希望能够单击我的窗口小部件所覆盖的桌面图标并与它们进行交互,就好像窗口小部件不存在一样.

JPr*_*mer 11

在Windows上,您可以设置 WS_EX_TRANSPARENT

要在Qt中执行此操作,请使用以下代码:

包括标题,

#if _WIN32
    #include <windows.h>
#endif
Run Code Online (Sandbox Code Playgroud)

并将以下代码放入构造函数中.

#if _WIN32
    HWND hwnd = (HWND) winId();
    LONG styles = GetWindowLong(hwnd, GWL_EXSTYLE);
    SetWindowLong(hwnd, GWL_EXSTYLE, styles | WS_EX_TRANSPARENT);
#endif
Run Code Online (Sandbox Code Playgroud)


mxt*_*tie 11

我找到了以下解决方案(在Linux上测试,根据@TheSHEEEP也适用于Windows):

setWindowFlags(windowFlags() | Qt::WindowTransparentForInput);
Run Code Online (Sandbox Code Playgroud)

它已被添加到更新的qt版本中(我没有找到时),请参阅http://doc.qt.io/qt-5/qt.html


Mar*_*utz 8

也许你想要的是

widget->setAttribute(Qt::WA_TransparentForMouseEvents)
Run Code Online (Sandbox Code Playgroud)

?这就是QRubberBand使用它来让父母处理鼠标事件.对于键盘事件,QWidget不会获得任何键盘事件,除非它自己设置了focusPolicy().

setFocusPolicy( Qt::NoFocus );
Run Code Online (Sandbox Code Playgroud)

因此应该照顾键盘事件.


Mal*_*eev 0

我认为重写应该有效:

bool YourMainWindow::event( QEvent *event )
{
   event ->accept();
   return true;
}
Run Code Online (Sandbox Code Playgroud)

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

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