工作中为了实现主窗口的醒目提示,需要使用叠加窗口,但是蒙板会阻止鼠标事件的向下传递,因此查找资料,发现有如下三种方法进行实现:
// 1.通过设置Mask实现
QWidget::setMask(QRegion(childrenRegion()));
// 2.通过设置鼠标透传标志实现
setAttribute(Qt::WA_TransparentForMouseEvents, true);
// 3.通过设置透明窗口实现
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
setAttribute(Qt::WA_TranslucentBackground, true);
给QWidget设置了stylesheet后,发现并不起作用,有人说可以换成QFrame来进行底色设置。经过一番折腾,发现如下二种方式设置后,可以进行底色设置:
// way1. Set Flag: Indicates the widget should be drawn using a styled background.
setAttribute(Qt::WA_StyledBackground);
// way2. Use paintEvent
void BorderFlicker::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.initFrom(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
由于作者要做的是窗口闪烁,故最后选择的代码搭配如下(简单好用):
// 设置鼠标透传
setAttribute(Qt::WA_TransparentForMouseEvents,true);
// 设置使用stylesheet来设置背景
setAttribute(Qt::WA_StyledBackground);
窗口闪烁主要是通过设置border的渐变stylesheet来实现的,可以看下最终效果: