最近在用qt写一个跨平台的软件,因为设置了无边框,并且我自己给程序窗口加了阴影,阴影范围又比较大

所以必须给阴影区域加上鼠标穿透才能有更好的体验。

上网查了一下,在windows下使用SetWindowLong就行

在linux下的搜了好久也找到了一个方法

就是XShapeCombineRectangles(QX11Info::display(), winId(), ShapeInput,

                0,0, NULL, 0, ShapeSet, YXBanded);(需要#include <X11/extensions/shape.h>)
我试了一下,的确有效,但是问题来了,设置穿透后怎么取消呢?
这个问题我又搜了很久,但是这次没那么幸运了,在百度和谷歌上都没有搜到相关问题
对于我这个linux小白来说可愁坏了
但是工夫不负有心人,试了一晚上,终于对这个函数有一点了解了,取消鼠标穿透的方法也试出来了。
下面就分享给大家

转发请注明出处(雨后星辰):http://www.cnblogs.com/AfterTheRainOfStars/p/4030042.html

 XRectangle* myrect = new XRectangle;
myrect->x = ;
myrect->y = ;
myrect->width = width();
myrect->height = height();
XShapeCombineRectangles(QX11Info::display(), winId(), ShapeInput, , , myrect,,ShapeSet,YXBanded);

在设置鼠标穿透的时候给函数传的第六个参数为NULL

查看函数的定义发现这个参数是XRectangle*类型的

下面直接说结论,当设置鼠标穿透的时候,如果这个参数为NULL,那整个窗口都将被穿透

然后第七个参数就是控制是设置穿透和取消穿透(取消为1)的了

但是,取消穿透的时候必须设置区域。不然设置第七个参数为1的时候程序会执行出错

我先前的误区就是在设置完第七个参数之后程序闪退,就一位那个参数不能动,后面就一直实验其他参数,但是都不行

后来再看一个博客的时候灵机一动就试了试将第六个参数的NULL改为一个XRectangle*对象,然后将第七个参数改为1就没有问题了。

这就是我解决问题的过程,希望能帮到大家。

05-04 10:26