前言:
现时咱们对“如何点击遮罩层把点击事件传给下一层”大体比较注意,我们都需要学习一些“如何点击遮罩层把点击事件传给下一层”的相关文章。那么小编同时在网上搜集了一些对于“如何点击遮罩层把点击事件传给下一层””的相关知识,希望兄弟们能喜欢,咱们一起来了解一下吧!## 一、前言
在有些项目中,需要在弹框的窗体背后遮罩原有主窗体,使得突出显示弹窗窗体,突然想到之前写过一个全局截屏的东东,原理一致,拿来改改。只需要引入一个头文件和实现文件,然后在主窗体中设置下需要遮罩的主窗体和可能弹窗窗体的类名即可,就是如此简单。可以支持多个窗体列表。
原理很简单,先安装事件过滤器,拦截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. 国内站点:[]()
2. 国际站点:[]()
3. 个人主页:[]()
4. 知乎主页:[]()
标签: #如何点击遮罩层把点击事件传给下一层