Qt实现半透明背景(遮罩)
实现功能
有时候我们的程序可能会需要弹出一个对话框,为了美观这个对话框后面需要半透明的遮罩。本文使用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实现半透明背景(遮罩)相关推荐
- qt绘制半透明的遮罩(通过qbrush设置半透明图片实现)
qt实现的半透明遮罩效果如下: 步骤: 1.用ps做一张透明度为50%的png图 ,如下: 2.在工程中吧png图片添加到资源中,如下: 3.在绘制矩形的时候,设置brush,如下: //设置笔刷为图 ...
- Linux下Qt窗口半透明,Qt实现嵌入桌面的半透明窗口 good
一.将Qt窗口嵌入到桌面中. 声明一个最简单的类: class Dialog : public QDialog { Q_OBJECT public: Dialog(QW ...
- Qt的半透明方法总结
如果是QWidget,可以重写了它的void paintEvent(QPaintEvent *);事件 如果是QGraphics,可以重写它的void paint(QPainter *painter, ...
- 半透明背景Activity实现AlertDialog弹窗效果
用半透明背景Activity实现AlertDialog弹窗效果的原因是,用小米手机测试项目时,发现工具类中的AlertDialog弹窗无法弹出,查阅资料才知道小米工程师为了防止有人作恶禁用了这项功能. ...
- 鼠标悬浮显示文字半透明背景
鼠标悬浮显示文字半透明背景 鼠标悬浮头像,出现文字"上传头像",之前都是使用< a title="上传头像"></a>这样的title来 ...
- cad lisp 背景遮罩_给文字批量添加边界偏移因子为1.1(或其他值)的背景遮罩的源程序(有详细注解)...
本帖最后由 作者 于 2007-11-6 9:06:55 编辑 CAD2005以后版本中就有了背景遮罩功能,但其默认值为1.5多数情况下不太合适 在Autodesk官方网站技术支持知识库查询,其中关于 ...
- 【CSS】背景遮罩层各种情况下,CSS样式
为什么80%的码农都做不了架构师?>>> 下面两种形式都不兼容ie6. 1. 背景遮罩层下面的内容不允许滚动: 给body加上 overflow:hidden: 的样式 2. ...
- android alertdialog 背景透明,Android Alertdialog弹出框设置半透明背景
自定义AlertDialog基本步骤: 1.写一个layout布局,使用inflater生成对应view对象 2.新建AlertDialog.Builder对象builder 3.builder设置自 ...
- android黑色半透明dialog背景,Android开发中Dialog半透明背景消失
近日,遇到一个Dialog半透明背景消失的问题,背景需求是自定义Dialog实现警告提示框: // 初始化警告弹出框 alertDialog = new EmpAlertView(context, U ...
最新文章
- 【Dlib】在GPU环境中运行dlib中的例子dnn_mmod_ex报错...dlib::cuda_error...Error while calling cudaMalloc...
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP
- SQL基础【二、SQL语法】
- 微信公众平台消息接口开发(2)-封装weixin.class.php
- python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解
- 用户行为变迁 行业垂直深耕——疫情下的2020年移动互联网报告
- 最长上升子序列_动态规划 最长上升子序列LIS
- string与string.h的区别
- powerbi如何创建参数_创建PowerBI「参数」轻松搞定动态分析
- 如何把握好 transition 和 animation 的时序,创作描边按钮特效...
- 按键精灵post请求_[教程] 以本论坛为例,手把手教你使用按键精灵POST登陆网页...
- c程序-RGB转十六进制
- 排查并解决磁盘满了问题
- 数学建模 预测方法集锦
- Programming Floppy Disk Controllers (下)
- 六张图,看懂前瞻性数据分析,该如何做
- JavaWeb-----Ajax异步请求 json对象 服务器如何返回json数据 使用ajax完成一个案例
- office2007 向程序发送命令时出现问题 的解决办法
- 软件开发,web开发和应用程序开发的区别?
- html怎么加漂浮物,仿天涯底部固定漂浮导航
热门文章
- 在计算机中配置了网关作用是什么意思,网关有什么用(网关详解网关作用大全)...
- 60 无键值Json数组和有键值json数组实验
- java中table属性,Table边框使用方法及属性大全
- 到底什么是POJO?
- 企业应该如何做好新闻营销推广
- 本篇主要介绍Runtime在开发中的一些使用场景,顺便讲解了下MJExtension的底层实现
- 药企数字化转型需要哪些软件
- android runtime异常,E / AndroidRuntime:致命错误:主要
- 微软经典面试100题系列(部分)
- Delphi 媒体播放器控件