PS:亲测有效!
转:http://www.qtcn.org/bbs/read-htm-tid-62394.html
最近接了个私活,需要在弹框的窗体背后遮罩原有主窗体,使得突出显示弹窗窗体,突然想到之前写过一个全局截屏的东东,原理一致,拿来改改。
优点:只需要引入一个头文件和实现文件即可,在主窗体中设置下需要遮罩的主窗体和可能弹窗窗体的类名即可。就是如此简单。
- //第一步,设置需要遮罩的父窗体
- MaskWidget::Instance()->setMainWidget(this);
- //第二步,设置哪些弹窗窗体需要被遮罩
- QStringList dialogNames;
- dialogNames << "frm1" << "frm2";
- MaskWidget::Instance()->setDialogNames(dialogNames);
- ScreenWidget::Instance()->showFullScreen();
效果图:
![](https://i-blog.csdnimg.cn/blog_migrate/b968d4633bba3db33431145980a257f7.gif)
项目案例图:
![](https://i-blog.csdnimg.cn/blog_migrate/880a857c29ac5a37026ddfa622191422.jpeg)
源码 下载 :
![](https://i-blog.csdnimg.cn/blog_migrate/0a76aaad9aff8b3ad61007df38aa8868.gif)
PS:支持从Qt4.6到Qt5.8任意版本+任意 编译 器。
近期颈椎疼,可能本站活跃度会大大降低一段时间,修养修养!
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
网友:
回 919974096 的帖子
需要在maskwidget构造函数中加一句,设置个置顶显示。
this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);
然后在事件过滤器中将弹窗窗体激活。
bool MaskWidget::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::Show) {
if (dialogNames.contains(obj->objectName())) {
this->show();
QWidget *w = (QWidget *)obj;
w->activateWindow();
}
} else if (event->type() == QEvent::Hide) {
if (dialogNames.contains(obj->objectName())) {
this->hide();
}
}
return QObject::eventFilter(obj, event);
}