#include "maskManager.h" #include MaskManager* MaskManager::m_instance = nullptr; void MaskManager::initialize(QWidget* mainWindow) { if(!m_instance) m_instance = new MaskManager(mainWindow); } MaskManager* MaskManager::instance() { Q_ASSERT(m_instance); return m_instance; } MaskManager::MaskManager(QWidget* mainWindow) : QObject(mainWindow) , m_mainWindow(mainWindow) { m_maskLayer = new QWidget(m_mainWindow); //m_maskLayer->setAttribute(Qt::WA_TransparentForMouseEvents, true); m_maskLayer->setStyleSheet("background:rgba(112,128,144,180);"); m_maskLayer->hide(); m_mainWindow->installEventFilter(this); //在Qt中,时间过滤会按照install的顺序反向执行,过程中,对于同一类型事件,任何一个过滤器返回true,表示事件被处理,后续过滤器和事件函数不会再被调用 } bool MaskManager::eventFilter(QObject* obj, QEvent* event) { if(obj == m_mainWindow && event->type() == QEvent::Resize) { if(m_maskLayer && m_maskLayer->isVisible()) m_maskLayer->setGeometry(m_mainWindow->rect()); } return QObject::eventFilter(obj, event); } void MaskManager::showMask(QWidget* requester) { if(m_activeRequests.isEmpty()) { m_maskLayer->setGeometry(m_mainWindow->rect()); //m_maskLayer->raise(); //显示在最上层,后续打开的同级子窗口依然在其之上 m_maskLayer->show(); } m_activeRequests.insert(requester); } void MaskManager::hideMask(QWidget* requester) { m_activeRequests.remove(requester); if(m_activeRequests.isEmpty()) m_maskLayer->hide(); }