Qt开源作品24-遮罩层窗体
2023-09-14 09:01:42 时间
一、前言
在有些项目中,需要在弹框的窗体背后遮罩原有主窗体,使得突出显示弹窗窗体,突然想到之前写过一个全局截屏的东东,原理一致,拿来改改。只需要引入一个头文件和实现文件,然后在主窗体中设置下需要遮罩的主窗体和可能弹窗窗体的类名即可,就是如此简单。可以支持多个窗体列表。
原理很简单,先安装事件过滤器,拦截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);
}
三、效果图
四、开源主页
- 以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。
- 本开源项目已经成功升级到V2.0版本,分门别类,图文并茂,保你爽到爆。
- Qt开源武林秘籍开发经验,看完学完,20K起薪,没有找我!
相关文章
- 【C/C++学院】(13)QT开发技术/QT 基础/QT 信号和槽
- Qt音视频开发36-超时检测和自动重连的设计
- Qt音视频开发11-通用监控布局控件(开源)
- Qt编写自定义控件31-面板仪表盘控件
- Qt开源作品系列文章导航
- Qt开源作品41-网络调试助手增强版V2022
- Qt开源作品33-图片开关控件
- Qt开源作品28-邮件发送工具
- Qt开源作品15-视频监控画面
- Qt开源作品13-三套样式表
- Qt开源作品12-硬盘容量控件
- Qt编写地图综合应用21-路径规划
- Qt QModbusRtuSerialSlave类
- Qt——常用数据类型
- Qt http模块的 QNetworkRequest 可以设置body吗
- Qt的线程(两种QThread类的详细使用方式)「建议收藏」
- C++Qt开发——QSS样式表
- Qt 单例模式的实现(4种方法)
- Qt如何disconnect一个lambda匿名函数
- Qt QSplitter布局
- QT编程之——使用全局变量
- Qt编写控件属性设计器5-属性中文