(一)Qt::WA_TransparentForMouseEvents
实现鼠标穿透功能,类似“隔空取物、隔山打牛”的效果。
//qwidget.h void setAttribute(Qt::WidgetAttribute, bool on = true);
启用后,此属性将禁止向小组件及其子件传递鼠标事件。鼠标事件被传递给其他小组件,就像小组件及其子代不存在于小组件层次结构中一样;鼠标点击和其他事件有效地 "穿过 "它们。这个属性在默认情况下是禁用的。
(二)用法
theButton->setAttribute(Qt::WA_TransparentForMouseEvents, true);
当前窗口透明区域不响应鼠标事件:
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); setAttribute(Qt::WA_TranslucentBackground, true);
如果当前窗口不透明,但又需要实现鼠标穿透,要注意代码先后顺序:
// 一定要先设置鼠标穿透,否则无法穿透 setAttribute(Qt::WA_TransparentForMouseEvents, true); setWindowFlag(Qt::FramelessWindowHint); setAttribute(Qt::WA_TranslucentBackground, true);
其他应用场景举例:
1、禁止响应鼠标的点击事件,但是需要响应代码层面的信号
2、如果有需要,相比较于设置控件的可用性,设置属性的做法更为隐蔽
3、有些透明窗体(或者异形界面)允许鼠标可以在本窗口界面操作背后的窗口
(三)例子
//按钮上显示的文字 QLabel * label = new QLabel; label->setParent(this); label->setFixedSize(menuBtn->width(),menuBtn->height()); label->setText(QString::number(i+1)); label->move(25 + (i%4)*70 , 130+ (i/4)*70); //设置label上的文字对齐方式 水平居中 和垂直居中 label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //鼠标事件穿透 label->setAttribute(Qt::WA_TransparentForMouseEvents,true);标签:Qt,WA,setAttribute,label,TransparentForMouseEvents,true,鼠标 From: https://www.cnblogs.com/imreW/p/17099014.html