工作中为了实现主窗口的醒目提示,需要使用叠加窗口,但是蒙板会阻止鼠标事件的向下传递,因此查找资料,发现有如下三种方法进行实现: 

// 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来实现的,可以看下最终效果:

窗口闪烁&QWidget多窗口鼠标透传&QWidget底色设置-LMLPHP

09-14 12:35