一、前言
最近被同事问到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&