Qt中鼠标穿透怎么实现呢?

bh20077 2012-06-25 08:20:32
就像一些音乐播放器的歌词一样,当锁定之后,桌面就会显示歌词,而且这个歌词不会响应鼠标的消息,就像没有歌词存在一样,鼠标会传到歌词下面的物件上去。
...全文
1844 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq619741808 2014-12-02
  • 打赏
  • 举报
回复
SetWindowLong()之前先获取 getWindowLong() ,重新设置下 就设置回去了
zhangyspa 2014-10-16
  • 打赏
  • 举报
回复
引用 17 楼 caploveleo 的回复:
#ifdef Q_OS_LINUX XShapeCombineRectangles(QX11Info::display(), winId(), ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded); #endif #ifdef Q_OS_WIN SetWindowLong(winId(), GWL_EXSTYLE, GetWindowLong(winId(), GWL_EXSTYLE) | WS_EX_TRANSPARENT | WS_EX_LAYERED); #endif
请问设置穿透之后怎么样才能设置回来?
caploveleo 2013-08-30
  • 打赏
  • 举报
回复
#ifdef Q_OS_LINUX XShapeCombineRectangles(QX11Info::display(), winId(), ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded); #endif #ifdef Q_OS_WIN SetWindowLong(winId(), GWL_EXSTYLE, GetWindowLong(winId(), GWL_EXSTYLE) | WS_EX_TRANSPARENT | WS_EX_LAYERED); #endif
caploveleo 2013-08-09
  • 打赏
  • 举报
回复
焦点穿透 很遗憾qt没有这个函数只好直接用x11shape的 XShapeCombineRectangles(QX11Info::display(), winId(), ShapeInput, 0, 0, NULL, 0, ShapeSet, YXBanded) 焦点穿透的意思是所有鼠标键盘操作全部会穿透窗口到下方窗口。有个 Qt::WA_TransparentForMouseEvents 可以对子部件实现,而窗口本身不行。kimtoy 没用到这个,不过很多 osd 桌面歌词程序经常用,网上找了下只有 gdk 的实现,于是就把 qt 的写在这里啦
ikenchina 2013-06-04
  • 打赏
  • 举报
回复
linux 下貌似没有这种机制实现, 可以用XShapeCombineRectangles来实现。是一种没有办法的办法
bh20077 2012-07-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
这样不行??
[/Quote]
这个只是子控件在父控件上可以穿透,但是父控件不能穿透到比如说桌面。只能用系统api了。
zhy282289 2012-07-01
  • 打赏
  • 举报
回复
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
这样不行??
bh20077 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

谷歌了一下,以前有人问 Windows 下的同样问题。
http://topic.csdn.net/t/20050519/00/4018122.html
[/Quote]
恩谢谢,看过了。
  • 打赏
  • 举报
回复
谷歌了一下,以前有人问 Windows 下的同样问题。
http://topic.csdn.net/t/20050519/00/4018122.html
dinjay 2012-06-28
  • 打赏
  • 举报
回复
windows上么?鼠标钩子即可。
setHookEx
bh20077 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

具体哪个函数不记得了,google一下,就那一个函数两行代码(windows)。
linux不熟,不知道
[/Quote]
Many thx!
jdwx 2012-06-28
  • 打赏
  • 举报
回复
具体哪个函数不记得了,google一下,就那一个函数两行代码(windows)。
linux不熟,不知道
bh20077 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

Qt木有这个功能,用API吧。
[/Quote]
能否具体说下什么API呢?win下和linux下的都要。好像是用x11shape的一个api,win下面调用那个long函数就可以了吗?
bh20077 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

鼠标事件让父窗体响应
C/C++ code

setAttribute(Qt::WA_TransparentForMouseEvents,true);
[/Quote]
这个只是子窗体对于父窗体可以做到,但是我现在的歌词窗口没有父窗口,是一个独立的控件,一般显示的时候,歌词下面比如说是桌面的一个图标,我双击的话应该是双击了桌面那个图标的,但是Qt里面双击同样会双击到歌词上面,这不是我想要的。
xiebin133 2012-06-26
  • 打赏
  • 举报
回复
用事件过滤器把事件装到父窗口上去。
念茜 2012-06-26
  • 打赏
  • 举报
回复
让父窗体响应鼠标事件

setAttribute(Qt::WA_TransparentForMouseEvents,true);
念茜 2012-06-26
  • 打赏
  • 举报
回复
鼠标事件让父窗体响应

setAttribute(Qt::WA_TransparentForMouseEvents,true);
tubo_true 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

让父窗体响应鼠标事件
C/C++ code

setAttribute(Qt::WA_TransparentForMouseEvents,true);
[/Quote]

try
jdwx 2012-06-25
  • 打赏
  • 举报
回复
Qt木有这个功能,用API吧。

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧