QT实现蒙层效果

一.蒙层的作用

1.为了其他窗口不被误操作,禁止对其他窗口操作

二.应用场景

1.一些触摸屏设备上弹出一个dialog窗口,在操作这个窗口的时候不希望后面的窗口被误操作

2.之前做一个医疗设备就曾有过这种需求,因为医疗设备对安全性要求非常高,是绝对不允许误触的

三.代码实现

1.mask.h

#include <QWidget>

class MaskWidget : public QWidget

{

    Q_OBJECT

public:

    static MaskWidget *Instance();

    explicit MaskWidget(QWidget *parent = 0);

protected:

    void showEvent(QShowEvent *);

    bool eventFilter(QObject *obj, QEvent *event);

private:

    static QScopedPointer<MaskWidget> self;

    QWidget *mainWidget;

    QStringList dialogNames;

public Q_SLOTS:

    void setMainWidget(QWidget *mainWidget);

    void setDialogNames(const QStringList &dialogNames);

    void setBgColor(const QColor &bgColor);

    void setOpacity(double opacity);

};

#endif // MASKWIDGET_H

2.mask.cpp

QScopedPointer<MaskWidget> MaskWidget::self;

MaskWidget *MaskWidget::Instance()

{

    if (self.isNull()) {

        static QMutex mutex;

        QMutexLocker locker(&mutex);

        if (self.isNull()) {

            self.reset(new MaskWidget);

        }

    }

    return self.data();

}

MaskWidget::MaskWidget(QWidget *parent) : QWidget(parent)

{

    mainWidget = 0;

    setOpacity(0.7);

    setBgColor(QColor(0, 0, 0));

    this->setGeometry(deskGeometry);

    this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);

    qApp->installEventFilter(this);

}

void MaskWidget::setMainWidget(QWidget *mainWidget)

{

    if (this->mainWidget != mainWidget) {

        this->mainWidget = mainWidget;

    }

}

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::Window, bgColor);

    this->setPalette(palette);

}

void MaskWidget::showEvent(QShowEvent *)

{

    if (mainWidget) {

        this->setGeometry(mainWidget->geometry());

    }

}

bool MaskWidget::eventFilter(QObject *obj, QEvent *event)

{

    int type = event->type();

    if (type == QEvent::Show) {

        if (dialogNames.contains(obj->objectName())) {

            this->show();

            this->activateWindow();

            QWidget *w = (QWidget *)obj;

            w->activateWindow();

        }

    } else if (type == QEvent::Hide) {

        if (dialogNames.contains(obj->objectName())) {

            this->hide();

        }

    } else if (type == QEvent::WindowActivate) {

        if (mainWidget) {

            if (obj->objectName() == mainWidget->objectName()) {

                if (this->isVisible()) {

                    this->activateWindow();

                }

            }

        }

    }

    return QObject::eventFilter(obj, event);

}

3.widget.cpp

frmMaskWidget::frmMaskWidget(QWidget *parent) : QWidget(parent), ui(new Ui::frmMaskWidget)

{

    ui->setupUi(this);

    initForm();

}

frmMaskWidget::~frmMaskWidget()

{

    delete ui;

}

void frmMaskWidget::initForm()

{

    MaskWidget::Instance()->setMainWidget(this->topLevelWidget());

    MaskWidget::Instance()->setDialogNames(QStringList() << "frmTest1");

}

void frmMaskWidget::on_pushButton_clicked()

{

    QDialog d;

    d.setObjectName("frmTest1");

    d.setWindowTitle("弹出窗体");

    d.resize(400, 300);

    d.exec();

}

void frmMaskWidget::on_pushButton_2_clicked()

{

    ui->pushButton_2->setText("AAA");

}

四.结果展示

相关推荐

  1. 使用Qt实现文本闪烁效果

    2024-03-29 16:38:03       63 阅读
  2. QT教程】QML音视频效果实现

    2024-03-29 16:38:03       31 阅读
  3. 耀斑-如何在Unity中实现耀斑亮光效果

    2024-03-29 16:38:03       119 阅读
  4. 如何用版制作玻璃划动效果

    2024-03-29 16:38:03       32 阅读
  5. QT:使用QStyle实现QMenu的滚动效果

    2024-03-29 16:38:03       55 阅读
  6. Qt程序设计-半透明遮罩效果窗口实现

    2024-03-29 16:38:03       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-29 16:38:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-29 16:38:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-29 16:38:03       87 阅读
  4. Python语言-面向对象

    2024-03-29 16:38:03       96 阅读

热门阅读

  1. Spring 的DI 依赖注入

    2024-03-29 16:38:03       47 阅读
  2. Linux Crontab定时表教学大全(一看就会!)

    2024-03-29 16:38:03       48 阅读
  3. 如何避免过度设计

    2024-03-29 16:38:03       53 阅读
  4. SparkSQL异常数据清洗API

    2024-03-29 16:38:03       48 阅读
  5. CentOS7.x 上安装并配置 MySQL 8.x

    2024-03-29 16:38:03       43 阅读
  6. 小程序配置服务器域名

    2024-03-29 16:38:03       53 阅读
  7. 构建docker环境下的thunder迅雷插件

    2024-03-29 16:38:03       50 阅读