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");

}

四.结果展示

相关推荐
哥不想学算法7 小时前
【C++】字符串字面量拼接
开发语言·c++
gugucoding8 小时前
21. 【C语言】打包不同类型:结构体
c语言·开发语言
Brookty8 小时前
【JavaEE】线程安全(一).4:写块串行保安全、CAS
java·开发语言·java-ee·多线程·线程安全
F20226974869 小时前
西门子 PLC 与 C# 通信
开发语言·c#
gugucoding10 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
万联WANFLOW10 小时前
多分支企业组网,IP 网段到底该怎么规划
开发语言·php
阿里嘎多学长11 小时前
2026-07-07 GitHub 热点项目精选
开发语言·程序员·github·代码托管
cookies_s_s12 小时前
C++ 字符串动态创建对象 -- 工厂模式、自动注册、模板递归动态调用
服务器·开发语言·c++
盐焗鹌鹑蛋13 小时前
【C++】继承
开发语言·c++