工作中为了实现主窗口的醒目提示,需要使用叠加窗口,但是蒙板会阻止鼠标事件的向下传递,因此查找资料,发现有如下三种方法进行实现:
- // 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来实现的,可以看下最终效果: