#include "maskManager.h" #include "maskLayer.h" #include #include #include #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 MaskLayer(m_mainWindow); // 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->show(); // foreach (QObject* child, m_mainWindow->children()) // { // if(qobject_cast(child) || qobject_cast(child)) // qDebug() << child->objectName(); // } } else { QWidget* widget = m_activeRequests.last(); const QMetaObject* meta = widget->metaObject(); int methodIndex = meta->indexOfMethod("showMask()"); if(methodIndex != -1) { //QMetaMethod method = meta->method(methodIndex); QMetaObject::invokeMethod(widget, "showMask", Qt::AutoConnection); } /*if(widget->parentWidget() == m_mainWindow && widget->isVisible() && !widget->isModal()) { // qDebug() << "Child Dialog Order:"; // foreach (QObject* child, m_mainWindow->children()) // { // if(qobject_cast(child) || qobject_cast(child)) // qDebug() << child->objectName(); // } widget->stackUnder(m_maskLayer); //widget->lower(); //强制刷新 //m_mainWindow->update(); //QApplication::processEvents(); }*/ } m_activeRequests.appendUnique(requester); //qDebug() << "append requester: " << requester->objectName() << "requester count: " << m_activeRequests.size(); } void MaskManager::hideMask(QWidget* requester) { m_activeRequests.remove(requester); if(m_activeRequests.isEmpty()) m_maskLayer->hide(); else { QWidget* widget = m_activeRequests.last(); const QMetaObject* meta = widget->metaObject(); int methodIndex = meta->indexOfMethod("hideMask()"); if(methodIndex != -1) QMetaObject::invokeMethod(widget, "hideMask", Qt::AutoConnection); widget->setFocus(); } //qDebug() << "remove requester: " << requester->objectName() << "requester count: " << m_activeRequests.size(); }