实现功能

有时候我们的程序可能会需要弹出一个对话框,为了美观这个对话框后面需要半透明的遮罩。本文使用QWidget实现了一个半透明的遮罩,可以设置遮罩的大小,颜色,透明度以及遮罩内要显示的对话框,遮罩能够随着中央对话框的显示而显示,对话框的隐藏而隐藏,效果如下:

遮罩MaskForm的实现

想法是将要显示的对话框安装事件过滤器MaskForm,MaskForm拦截对话框的QEvent::Show和QEvent::Hide两个事件,与对话框进行同步显示隐藏,并在MaskForm的ShowEvent事件中确定显示的位置,代码如下

#ifndef MASKFORM_H
#define MASKFORM_H#include <QWidget>
#include <QApplication>class MaskForm : public QWidget
{Q_OBJECT
public:explicit MaskForm(QWidget *parent = 0);~MaskForm();/*** @brief 注册要显示在遮罩中的窗口* @param widget 要显示的窗口*/void installWidget(QWidget *widget);/*** @brief 设置遮罩的颜色,透明度* @param color 遮罩颜色* @param opacity 透明度*/void setMaskColor(const QColor &color, float opacity);/*** @brief 设置顶层窗口(覆盖窗口)* @param widget 顶层窗口*/void setTopWidget(QWidget *widget);private:void init();void showEvent(QShowEvent *event);bool eventFilter(QObject *watched, QEvent *event);private:QWidget *m_topWidget;   //顶层窗口,设置遮罩大小QWidget *m_widget;      //遮罩中显示的窗口
};#endif // MASKFORM_H
#include "MaskForm.h"#include <QDebug>
#include <QGridLayout>MaskForm::MaskForm(QWidget *parent): m_widget(nullptr), m_topWidget(nullptr), QWidget(parent)
{init();
}MaskForm::~MaskForm()
{}void MaskForm::installWidget(QWidget *widget)
{if (widget == nullptr) {return;}widget->installEventFilter(this);m_widget = widget;connect(m_widget, &QWidget::destroyed, this, [=](){m_widget = nullptr;});
}void MaskForm::setMaskColor(const QColor &color, float opacity)
{if (!color.isValid()) {return;}QPalette palette = this->palette();palette.setColor(QPalette::Window, color);this->setPalette(palette);setWindowOpacity(opacity);
}void MaskForm::setTopWidget(QWidget *widget)
{if (widget == nullptr) {return;}m_topWidget = widget;
}void MaskForm::init()
{setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);setMaskColor(QColor(245, 125, 0), 0.6f);m_topWidget = QApplication::activeWindow();
}void MaskForm::showEvent(QShowEvent *event)
{Q_UNUSED(event);this->setGeometry(m_topWidget->geometry());
}bool MaskForm::eventFilter(QObject *watched, QEvent *event)
{if (watched == m_widget) {if (event->type() == QEvent::Show) {this->show();}if (event->type() == QEvent::Hide) {this->hide();}}return QObject::eventFilter(watched, event);
}

MaskForm的使用

//使用遮罩
void DownLoadListForm::on_btnCreate_clicked()
{MaskForm maskForm;CreateDownloadDialog dlg(&maskForm);//将遮罩设置为中央窗口的父窗口maskForm.installWidget(&dlg);//注册中央窗口,进行事件拦截dlg.exec();
}

Qt实现半透明背景(遮罩)相关推荐

  1. qt绘制半透明的遮罩(通过qbrush设置半透明图片实现)

    qt实现的半透明遮罩效果如下: 步骤: 1.用ps做一张透明度为50%的png图 ,如下: 2.在工程中吧png图片添加到资源中,如下: 3.在绘制矩形的时候,设置brush,如下: //设置笔刷为图 ...

  2. Linux下Qt窗口半透明,Qt实现嵌入桌面的半透明窗口 good

    一.将Qt窗口嵌入到桌面中. 声明一个最简单的类: class Dialog : public QDialog {         Q_OBJECT public:         Dialog(QW ...

  3. Qt的半透明方法总结

    如果是QWidget,可以重写了它的void paintEvent(QPaintEvent *);事件 如果是QGraphics,可以重写它的void paint(QPainter *painter, ...

  4. 半透明背景Activity实现AlertDialog弹窗效果

    用半透明背景Activity实现AlertDialog弹窗效果的原因是,用小米手机测试项目时,发现工具类中的AlertDialog弹窗无法弹出,查阅资料才知道小米工程师为了防止有人作恶禁用了这项功能. ...

  5. 鼠标悬浮显示文字半透明背景

    鼠标悬浮显示文字半透明背景 鼠标悬浮头像,出现文字"上传头像",之前都是使用< a title="上传头像"></a>这样的title来 ...

  6. cad lisp 背景遮罩_给文字批量添加边界偏移因子为1.1(或其他值)的背景遮罩的源程序(有详细注解)...

    本帖最后由 作者 于 2007-11-6 9:06:55 编辑 CAD2005以后版本中就有了背景遮罩功能,但其默认值为1.5多数情况下不太合适 在Autodesk官方网站技术支持知识库查询,其中关于 ...

  7. 【CSS】背景遮罩层各种情况下,CSS样式

    为什么80%的码农都做不了架构师?>>>    下面两种形式都不兼容ie6. 1. 背景遮罩层下面的内容不允许滚动: 给body加上 overflow:hidden: 的样式 2. ...

  8. android alertdialog 背景透明,Android Alertdialog弹出框设置半透明背景

    自定义AlertDialog基本步骤: 1.写一个layout布局,使用inflater生成对应view对象 2.新建AlertDialog.Builder对象builder 3.builder设置自 ...

  9. android黑色半透明dialog背景,Android开发中Dialog半透明背景消失

    近日,遇到一个Dialog半透明背景消失的问题,背景需求是自定义Dialog实现警告提示框: // 初始化警告弹出框 alertDialog = new EmpAlertView(context, U ...

最新文章

  1. 【Dlib】在GPU环境中运行dlib中的例子dnn_mmod_ex报错...dlib::cuda_error...Error while calling cudaMalloc...
  2. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP
  3. SQL基础【二、SQL语法】
  4. 微信公众平台消息接口开发(2)-封装weixin.class.php
  5. python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解
  6. 用户行为变迁 行业垂直深耕——疫情下的2020年移动互联网报告
  7. 最长上升子序列_动态规划 最长上升子序列LIS
  8. string与string.h的区别
  9. powerbi如何创建参数_创建PowerBI「参数」轻松搞定动态分析
  10. 如何把握好 transition 和 animation 的时序,创作描边按钮特效...
  11. 按键精灵post请求_[教程] 以本论坛为例,手把手教你使用按键精灵POST登陆网页...
  12. c程序-RGB转十六进制
  13. 排查并解决磁盘满了问题
  14. 数学建模 预测方法集锦
  15. Programming Floppy Disk Controllers (下)
  16. 六张图,看懂前瞻性数据分析,该如何做
  17. JavaWeb-----Ajax异步请求 json对象 服务器如何返回json数据 使用ajax完成一个案例
  18. office2007 向程序发送命令时出现问题 的解决办法
  19. 软件开发,web开发和应用程序开发的区别?
  20. html怎么加漂浮物,仿天涯底部固定漂浮导航

热门文章

  1. 在计算机中配置了网关作用是什么意思,网关有什么用(网关详解网关作用大全)...
  2. 60 无键值Json数组和有键值json数组实验
  3. java中table属性,Table边框使用方法及属性大全
  4. 到底什么是POJO?
  5. 企业应该如何做好新闻营销推广
  6. 本篇主要介绍Runtime在开发中的一些使用场景,顺便讲解了下MJExtension的底层实现
  7. 药企数字化转型需要哪些软件
  8. android runtime异常,E / AndroidRuntime:致命错误:主要
  9. 微软经典面试100题系列(部分)
  10. Delphi 媒体播放器控件