一.效果
二.原理
原理很简单,就是在主窗口上覆盖一层半透明窗口,然后把需要遮罩显示的窗口(嵌入窗口)布局到该半透明窗口中
网上很多实现方法是将主窗口截图绘制到遮罩窗口,然后再调用QPainter的fillRectr(rect(), QColor(0,0,0,100))来实现半透明效果,这种方法显然是不行的,因为这样的话就看不到主窗口中的动图了
因此需要直接把遮罩窗口设置为半透明效果,这样就能看到主窗口中的动图,如效果图所示,遮罩时依然能看到滚动条和动图的动画效果
设置遮罩窗口半透明的代码如下
QHMaskWidget::QHMaskWidget(QWidget *parent)
: QWidget(parent)
, m_embeddedWindow(nullptr)
{
parent->installEventFilter(this);
setVisible(false);
QPalette pal(palette());
pal.setColor(QPalette::Background, QColor(0, 0, 0, 100));
setAutoFillBackground(true);
setPalette(pal);
}
使用时,将主窗口的指针传到遮罩窗口QHMaskWidget的构造函数中,在该构造函数中会调用主窗口指针安装事件过滤器,这样在遮罩窗口中就可以处理主窗口的事件
这里要过滤主窗口的Resize事件,因为遮罩窗口需要在主窗口缩放时,依然能完整覆盖,代码如下