忽略点击事件并将其传递给后台窗口的QMainWindow

7
我想创建一个半透明的信息窗口,不会妨碍用户的其他活动。任何对该窗口的点击都应该像窗口不存在一样被忽略。
您建议如何实现这样的行为?有没有简单的方法可以做到这一点,还是我必须遵循笨拙的解决方法?我考虑隐藏窗口,重新执行点击,然后再次显示窗口。但这仍然会破坏拖放手势。

你曾经成功实现过这个吗?我正在尝试实现同样的功能。 - Kolyunya
2个回答

7

看一下Qt::WidgetAttribute的枚举值:Qt::WA_TransparentForMouseEvents

启用此属性时,它会禁用鼠标事件传递到窗口小部件及其子级。鼠标事件将被传递给其他窗口小部件,就好像该窗口小部件及其子级不存在于窗口小部件层次结构中一样;鼠标点击和其他事件实际上会“穿过”它们。默认情况下,此属性被禁用。


这样吗?我可能错了,但它似乎在Windows上不起作用。 - Pieter
@Pieter,您是否希望您的点击能够穿过半透明信息窗口传递到属于同一或另一个应用程序的另一个窗口中? - Bill
@Pieter 这里重要的是据我所知,只有当该窗口属于相同的 Qt 应用程序时,具有 Qt::WA_TransparentForMouseEvents 属性的半透明信息窗口上的单击才会被另一个窗口接收。我查看了 Qt 源代码,并发现所提到的属性会影响 QWidget * QApplication::widgetAt (const QPoint & point) [static] 的行为,该函数在内部用于决定应用程序中哪个窗口会获得鼠标事件。 - Bill
当然...那么这个解决方案对我来说就行不通了。我需要我的鼠标事件无论窗口后面有什么都能穿透过去。 - Pieter
在这种情况下,我认为仅凭Qt API无法帮助您解决此问题。您需要使用每个操作系统的本机API进行工作。(我可以帮您处理win32。您可以通过WId QWidget::effectiveWinId () const获取小部件的窗口系统标识符(HWND)。然后,您可以通过SetWindowLong函数设置WS_EX_NOACTIVATE [扩展窗口样式](http://msdn.microsoft.com/en-us/library/windows/desktop/ff700543%28v=vs.85%29.aspx)。) - Bill
我以前从未使用过Windows API,并且这将破坏应用程序的跨平台兼容性,因此这绝对是一个不小的不便。谢谢-我会调查一下。 - Pieter

0

我对“鼠标事件透明度”进行了更深入的研究(不知道确切的术语),并找到了this

我认为没有一般且简单的方法来解决你的问题。你可能需要深入挖掘本地API。一旦事件到达应用程序,它们就不会自动转发到其他应用程序。

你们觉得呢?我是否注定要使用每个操作系统的本地API?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接