QWidget中setMask函数

QWidget中setMask函数_第1张图片

1.场景说明

在项目中,我们有时候会遇到一些特殊的UI场景。比如如下图所示:

QWidget中setMask函数_第2张图片

 

这种带阴影的模糊效果,其实这种效果的方法很多。但是我想的是,尽量不要让我自己手动写代码实现效果。用UI设计器能搞定就行了。尽量少手写代码

像这种的带浮层的阴影效果,最上面就是一层阴影的窗口。

这样就会有一个问题,就是上面的是阴影窗口。如果下面有按钮或者其他的窗口,你点击的时候就不会有事件过来。因为事件被上一层窗口截获了。

有的朋友就可能会想到用setAttribute(Qt::WA_TransparentForMouseEvents)函数,但是这个函数会导致另外一个问题。就是如果你上层的窗口也有其他的按钮事件,这个时候这个按钮就会接受不到事件。

我在项目也遇到了这样的问题,所以一开始我都不知道怎么下手,关键字是什么。没办法,我就看看Qt assistant的文档,在QWidget仔细找找有没有相关的函数。果然,有个setMask函数成功的引起了我的注意。

void QWidget::setMask(const QRegion & region)

This is an overloaded function.

Causes only the parts of the widget which overlap region to be visible. If the region includes pixels outside the rect() of the widget, window system controls in that area may or may not be visible, depending on the platform.

Note that this effect can be slow if the region is particularly complex.

大概意思就是可以通过region,这个参数来决定某些区域是可见的。在region范围内就是可见的,其他的都是不可见的也就是透明的区域。注意,如果region很复杂,性能会下降。

2.demo演示

为了帮助大家更好的理解,写了个demo

1.界面显示

label所在的widgetA其实是在widgetB的上面,因为widgetA背景色设置透明的。

QWidget中setMask函数_第3张图片

我再给WidgetA设置个背景色,这样你就看的清楚了。

QWidget中setMask函数_第4张图片

下面的这将WidgetA背景色设置为透明的。

QWidget中setMask函数_第5张图片

代码如下:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    qDebug() << "button clicked";
}

再点击时候按钮的时候根本就没有响应事件过来了。

修改一行代码,再看看效果:

QWidget中setMask函数_第6张图片

只需要再构造函数添加一行代码,就实现了效果。

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->widgetA->setMask(ui->label->geometry());
}

3.结束

到这里就结束了,但是大家在看文档的时候会发现它还有个重载函数void QWidget::setMask(const QBitmap & bitmap),有兴趣的大家自己再试试。

你可能感兴趣的:(Qt实战记录,qt,透明窗口,setMask)