关于Qt::WA_TransparentForMouseEvents的一些记录

本文探讨了Qt::WA_TransparentForMouseEvents属性在Qt开发中的实际效果与预期不符的情况,通过代码示例展示了该属性在不同场景下的行为,并通过源码分析和社区反馈揭示其工作原理。作者发现该属性仅适用于子控件,而非顶级窗口,并推荐使用Qt::WindowTransparentForInput属性实现鼠标完全穿透。
摘要由CSDN通过智能技术生成

一、前言
最近被同事问到Qt::WA_TransparentForMouseEvents这个Qt属性相关问题,然后就神奇的发现这个方法跟我们自己预想的功能不太一样,下面会详细记录这一过程,也希望对正在迷惑的你有一定的帮助。
另外附注一下,本文中用到的Qt版本比较高(5.15.0),Qt Creator版本7.0.1(本来Qt版本用的6.2.1,这个版本被删除了)


二、Qt::WA_TransparentForMouseEvents不起作用
在项目中,我写代码一般情况下都不喜欢用Qt的可视化界面(就是设计界面,拖拽控件就可以得到界面),我喜欢手动写布局界面,大概代码如下所示:

#include "widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent) : QWidget(parent)
{
    QPushButton *btn =new QPushButton(this);
    btn->setText("btn");    
    this->setAttribute(Qt::WA_TransparentForMouseEvents,true);
    this->setFixedSize(300,200);
}

这里测试代码写的非常简单,就是界面(不带ui文件)上有一个按钮,然后设置界面透传鼠标事件,运行起来后结果如下所示:
请添加图片描述
这里就很明显发现this已经设置了鼠标透传,根据Qt文档说明,this上的子控件就应该收不到鼠标事件了,但是这里居然诡异的出现了鼠标划到按钮上的样式变化,接下来还有更鬼扯的。
我听说使用ui文件,在this中设置ui文件的控件透传鼠标事件是可以成功的,于是我马上改了一下代码,设计界面如下所示:
在这里插入图片描述
这里界面也写的非常简单,就是在窗口上面套了一层Widget,然后Widget里面放置了一个按钮,然后对应构造函数如下所示:

#include "widget.h"
#include "ui_widget.h&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值