PowerModeler/source/maskManager.cpp

87 lines
2.6 KiB
C++
Raw Normal View History

#include "maskManager.h"
#include <QEvent>
#include <QApplication>
#include <QDialog>
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->setObjectName("maskLayer");
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();
}
else
{
QWidget* widget = m_activeRequests.last();
if(widget->parentWidget() == m_mainWindow && widget->isVisible() && !widget->isModal())
{
// qDebug() << "Child Dialog Order:";
// foreach (QObject* child, m_mainWindow->children())
// {
// if(qobject_cast<QDialog*>(child) || qobject_cast<QWidget*>(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();
widget->raise();
}
//qDebug() << "remove requester: " << requester->objectName() << "requester count: " << m_activeRequests.size();
}