鼠标穿透的意思是所有鼠标键盘操作全部会穿透窗口到下方窗口,一种是穿透到父窗口,一种是穿透到桌面。
一、穿透到父窗口
当前窗口及子控件均不响应鼠标事件
setAttribute(Qt::WA_TransparentForMouseEvents, true);
当前窗口透明区域不响应鼠标事件
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
setAttribute(Qt::WA_TranslucentBackground, true);
自定义当前窗口区域响应鼠标事件
void QWidget::setMask(const QRegion ®ion)
注意:如果设置的区域很复杂,效果可能会很慢。
二、穿透到桌面
鼠标点击穿透被广泛应用在桌面挂件程序上,目的是为了避免鼠标对窗体进行误操作。
Qt 并没有自带的方法可以实现该功能,所以需要调用系统本身的 API 来实现。这里介绍下 Windows 下和 Linux 下如何实现鼠标点击穿透。
很多 osd 桌面歌词程序经常用
#ifdef Q_OS_LINUX
#include <X11/extensions/shape.h>
#endif
#ifdef Q_OS_WIN
#include <windows.h>
#endif
#ifdef Q_OS_LINUX
XShapeCombineRectangles(QX11Info::display(), winId(), ShapeInput, 0,