• 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);
    }
    

    三、效果图

    四、开源主页

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

    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/
  • 相关阅读:
    ubuntu下安装常用软件合集
    Ubuntu16升级到18
    VScode安装教程
    查看系统信息脚本
    Excel应用笔记
    后缀数组
    笔记-AHOI2013 差异
    二分图
    动态规划dp
    笔记-CF1354E Graph Coloring
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/13025354.html
Copyright © 2020-2023  润新知