QWidget中setMask函数

1.场景说明

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

 

这种带阴影的模糊效果,其实这种效果的方法很多。但是我想的是,尽量不要让我自己手动写代码实现效果。用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背景色设置透明的。

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

Image

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

Image

代码如下:

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";
}

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

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

Image

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

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),有兴趣的大家自己再试试。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值