Qt开源作品24-遮罩层窗体

简介:

一、前言

在有些项目中,需要在弹框的窗体背后遮罩原有主窗体,使得突出显示弹窗窗体,突然想到之前写过一个全局截屏的东东,原理一致,拿来改改。只需要引入一个头文件和实现文件,然后在主窗体中设置下需要遮罩的主窗体和可能弹窗窗体的类名即可,就是如此简单。可以支持多个窗体列表。
原理很简单,先安装事件过滤器,拦截QEvent::Show事件,拿到当前窗体,如果在需要遮罩的窗体列表中,则弹出半透明的窗体,大小和弹出的窗体大小一致,然后在激活当前弹出的窗体。

二、代码思路

//使用方法
//第一步,设置需要遮罩的父窗体
MaskWidget::Instance()->setMainWidget(this);
//第二步,设置哪些弹窗窗体需要被遮罩
QStringList dialogNames;
dialogNames << "frm1" << "frm2";
MaskWidget::Instance()->setDialogNames(dialogNames);

//核心代码
void MaskWidget::setDialogNames(const QStringList &dialogNames)
{
    if (this->dialogNames != dialogNames) {
        this->dialogNames = dialogNames;
    }
}

void MaskWidget::setOpacity(double opacity)
{
    this->setWindowOpacity(opacity);
}

void MaskWidget::setBgColor(const QColor &bgColor)
{
    QPalette palette = this->palette();
    palette.setBrush(QPalette::Background, bgColor);
    this->setPalette(palette);
}

void MaskWidget::showEvent(QShowEvent *)
{
    if (mainWidget != 0) {
        this->setGeometry(mainWidget->geometry());
    }
}

bool MaskWidget::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::Show) {
        if (dialogNames.contains(obj->objectName())) {
            this->show();
            this->activateWindow();
            QWidget *w = (QWidget *)obj;
            w->activateWindow();
        }
    } else if (event->type() == QEvent::Hide) {
        if (dialogNames.contains(obj->objectName())) {
            this->hide();
        }
    } else if (event->type() == QEvent::WindowActivate) {
        //当主窗体激活时,同时激活遮罩层
        if (mainWidget != 0) {
            if (obj->objectName() == mainWidget->objectName()) {
                if (this->isVisible()) {
                    this->activateWindow();
                }
            }
        }
    }

    return QObject::eventFilter(obj, event);
}

三、效果图

maskwidget

四、开源主页

以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 个人主页:https://blog.csdn.net/feiyangqingyun
  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
相关文章
|
7月前
Qt 布局管理之 堆栈窗体
Qt 布局管理之 堆栈窗体
76 5
|
C++ Python
Python+Qt窗体或Django网页支付宝收款码-扫码付款实例
Python+Qt窗体或Django网页支付宝收款码-扫码付款实例
426 0
我的Qt作品(3)基于QTabWidget和AdvancedDocking实现的Ribbon风格主界面【开源】
我的Qt作品(3)基于QTabWidget和AdvancedDocking实现的Ribbon风格主界面【开源】
1752 0
我的Qt作品(3)基于QTabWidget和AdvancedDocking实现的Ribbon风格主界面【开源】
|
7月前
[Qt5] 右键窗体弹出菜单,实现图像适应窗体大小
[Qt5] 右键窗体弹出菜单,实现图像适应窗体大小
125 0
|
网络协议 C++ Python
Qt+C++ TCP发送接收信息客户端与服务端窗体
Qt+C++ TCP发送接收信息客户端与服务端窗体
148 0
Qt+C++ TCP发送接收信息客户端与服务端窗体
|
C++ 计算机视觉 Python
VS+QT+PCL点云窗体程序显示编辑保存
VS+QT+PCL点云窗体程序显示编辑保存
313 0
VS+QT+PCL点云窗体程序显示编辑保存
|
安全 C语言 C++
Qt: 一个适用于Qt的httpserver 开源库介绍
Qt: 一个适用于Qt的httpserver 开源库介绍
984 0
|
C++
Qt界面优化:Qt窗体控件设置
Qt界面优化:Qt窗体控件设置
459 1
Qt界面优化:Qt窗体控件设置
|
数据格式
基于STM32+Qt上位机的RGB调色器,全开源!
基于STM32+Qt上位机的RGB调色器,全开源!
315 0
基于STM32+Qt上位机的RGB调色器,全开源!