2025-04-14 12:10:07 +08:00
|
|
|
|
#include "maskManager.h"
|
2025-04-21 14:29:20 +08:00
|
|
|
|
#include "maskLayer.h"
|
2025-04-14 12:10:07 +08:00
|
|
|
|
#include <QEvent>
|
2025-04-16 16:37:32 +08:00
|
|
|
|
#include <QApplication>
|
|
|
|
|
|
#include <QDialog>
|
2025-04-21 14:29:20 +08:00
|
|
|
|
#include <QMetaMethod>
|
2025-04-14 12:10:07 +08:00
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
{
|
2025-04-21 14:29:20 +08:00
|
|
|
|
m_maskLayer = new MaskLayer(m_mainWindow);
|
|
|
|
|
|
// m_maskLayer->setStyleSheet("background:rgba(112,128,144,180);");
|
|
|
|
|
|
// m_maskLayer->hide();
|
2025-05-09 14:54:20 +08:00
|
|
|
|
m_mainWindow->installEventFilter(this); //在Qt中,事件过滤会按照install的顺序反向执行,过程中,对于同一类型事件,任何一个过滤器返回true,表示事件被处理,后续过滤器和事件函数不会再被调用
|
2025-04-14 12:10:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-15 16:39:36 +08:00
|
|
|
|
void MaskManager::showMask(QWidget* requester)
|
2025-04-14 12:10:07 +08:00
|
|
|
|
{
|
2025-04-15 16:39:36 +08:00
|
|
|
|
if(m_activeRequests.isEmpty())
|
2025-04-14 12:10:07 +08:00
|
|
|
|
{
|
|
|
|
|
|
m_maskLayer->setGeometry(m_mainWindow->rect());
|
|
|
|
|
|
m_maskLayer->show();
|
2025-04-21 14:29:20 +08:00
|
|
|
|
// foreach (QObject* child, m_mainWindow->children())
|
|
|
|
|
|
// {
|
|
|
|
|
|
// if(qobject_cast<QDialog*>(child) || qobject_cast<QWidget*>(child))
|
|
|
|
|
|
// qDebug() << child->objectName();
|
|
|
|
|
|
// }
|
2025-04-14 12:10:07 +08:00
|
|
|
|
}
|
2025-04-16 16:37:32 +08:00
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
QWidget* widget = m_activeRequests.last();
|
2025-06-10 15:41:53 +08:00
|
|
|
|
if(!widget->windowFlags().testFlag(Qt::Dialog))
|
2025-04-21 14:29:20 +08:00
|
|
|
|
{
|
2025-04-21 16:57:09 +08:00
|
|
|
|
const QMetaObject* meta = widget->metaObject();
|
|
|
|
|
|
int methodIndex = meta->indexOfMethod("showMask()");
|
|
|
|
|
|
if(methodIndex != -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
//QMetaMethod method = meta->method(methodIndex);
|
|
|
|
|
|
QMetaObject::invokeMethod(widget, "showMask", Qt::AutoConnection);
|
|
|
|
|
|
}
|
2025-04-21 14:29:20 +08:00
|
|
|
|
}
|
2025-04-21 16:57:09 +08:00
|
|
|
|
else
|
|
|
|
|
|
widget->lower();
|
2025-04-16 16:37:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_activeRequests.appendUnique(requester);
|
|
|
|
|
|
//qDebug() << "append requester: " << requester->objectName() << "requester count: " << m_activeRequests.size();
|
2025-04-14 12:10:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void MaskManager::hideMask(QWidget* requester)
|
|
|
|
|
|
{
|
2025-04-15 16:39:36 +08:00
|
|
|
|
m_activeRequests.remove(requester);
|
|
|
|
|
|
if(m_activeRequests.isEmpty())
|
2025-04-14 12:10:07 +08:00
|
|
|
|
m_maskLayer->hide();
|
2025-04-16 16:37:32 +08:00
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
QWidget* widget = m_activeRequests.last();
|
2025-06-10 15:41:53 +08:00
|
|
|
|
if(!widget->windowFlags().testFlag(Qt::Dialog))
|
2025-04-21 16:57:09 +08:00
|
|
|
|
{
|
|
|
|
|
|
const QMetaObject* meta = widget->metaObject();
|
|
|
|
|
|
int methodIndex = meta->indexOfMethod("hideMask()");
|
|
|
|
|
|
if(methodIndex != -1)
|
|
|
|
|
|
QMetaObject::invokeMethod(widget, "hideMask", Qt::AutoConnection);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
widget->raise();
|
2025-04-16 16:37:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//qDebug() << "remove requester: " << requester->objectName() << "requester count: " << m_activeRequests.size();
|
2025-04-14 12:10:07 +08:00
|
|
|
|
}
|