Qt编写的遮罩层窗体

PS:亲测有效!


转:http://www.qtcn.org/bbs/read-htm-tid-62394.html


最近接了个私活,需要在弹框的窗体背后遮罩原有主窗体,使得突出显示弹窗窗体,突然想到之前写过一个全局截屏的东东,原理一致,拿来改改。
优点:只需要引入一个头文件和实现文件即可,在主窗体中设置下需要遮罩的主窗体和可能弹窗窗体的类名即可。就是如此简单。

复制代码
  1. //第一步,设置需要遮罩的父窗体
  2.     MaskWidget::Instance()->setMainWidget(this);
  3.     //第二步,设置哪些弹窗窗体需要被遮罩
  4.     QStringList dialogNames;
  5.     dialogNames << "frm1" << "frm2";
  6.     MaskWidget::Instance()->setDialogNames(dialogNames);
附带的全局截屏类,也是只要一行代码即可在项目任何地方使用全局截屏。
复制代码
  1. ScreenWidget::Instance()->showFullScreen();
是不是接口极为简单方便呢。
效果图:
Qt编写的遮罩层窗体_第1张图片
项目案例图:
Qt编写的遮罩层窗体_第2张图片

源码 下载  maskdemo.zip (158 K) 下载次数:169 
PS:支持从Qt4.6到Qt5.8任意版本+任意 编译 器。
近期颈椎疼,可能本站活跃度会大大降低一段时间,修养修养!


、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

网友:

回 919974096 的帖子
919974096 :有一个问题,在弹出弹窗一出现遮罩后,然后点击任务栏图标隐藏出现,就没有遮罩了。。
 (2016-12-29 14:07) 

需要在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);
}



你可能感兴趣的:(Qt编写的遮罩层窗体)