添加MaskManager模块,实现主窗口遮罩效果
This commit is contained in:
parent
d2696abadb
commit
4c064524f2
|
|
@ -39,6 +39,7 @@ set(H_HEADER_FILES
|
|||
include/attributeTableDelegate.h
|
||||
include/attributeView.h
|
||||
include/attributeSelector.h
|
||||
include/maskManager.h
|
||||
)
|
||||
|
||||
set(CPP_SOURCE_FILES
|
||||
|
|
@ -64,6 +65,7 @@ set(CPP_SOURCE_FILES
|
|||
source/attributeTableDelegate.cpp
|
||||
source/attributeView.cpp
|
||||
source/attributeSelector.cpp
|
||||
source/maskManager.cpp
|
||||
)
|
||||
|
||||
set(UI_FILES
|
||||
|
|
|
|||
|
|
@ -37,11 +37,8 @@ protected:
|
|||
|
||||
private:
|
||||
void initialize();
|
||||
void showMaskLayer();
|
||||
void hideMaskLayer();
|
||||
|
||||
Ui::MainWindow *ui;
|
||||
QWidget* m_maskLayer;
|
||||
DatabaseManager* m_dbManager;
|
||||
DatabaseBrowser* m_dbBrowser;
|
||||
QSqlError m_lastSqlError;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
#ifndef MASKMANAGER_H
|
||||
#define MASKMANAGER_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QSet>
|
||||
|
||||
class MaskManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
//初始化时强制关联窗口
|
||||
static void initialize(QWidget* mainWindow);
|
||||
static MaskManager* instance();
|
||||
|
||||
void showMask(QWidget* requester);
|
||||
void hideMask(QWidget* requester);
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject* obj, QEvent* event) override;
|
||||
|
||||
private:
|
||||
explicit MaskManager(QWidget* mainWindow);
|
||||
static MaskManager* m_instance;
|
||||
QWidget* m_mainWindow;
|
||||
QWidget* m_maskLayer;
|
||||
QSet<QWidget*> m_activeRequsets;
|
||||
};
|
||||
|
||||
#endif //MASKMANAGER_H
|
||||
|
|
@ -17,10 +17,6 @@ TextEditWidget::TextEditWidget(QWidget* parent)
|
|||
ui->setupUi(this);
|
||||
setWindowFlags(Qt::FramelessWindowHint);
|
||||
|
||||
//不设置焦点策略,点击按钮后会触发tableView的Tab键(原因尚不清楚)
|
||||
ui->btnConfirm->setFocusPolicy(Qt::NoFocus);
|
||||
ui->btnCancle->setFocusPolicy(Qt::NoFocus);
|
||||
|
||||
m_promptString = "";
|
||||
m_patternString = "";
|
||||
|
||||
|
|
|
|||
|
|
@ -14,8 +14,7 @@ AttributeView::AttributeView(const ModelAttributeGroup& modelAttributeGroup, QWi
|
|||
m_tableView = new QTableView(this);
|
||||
m_tableView->setStyleSheet("QTableView::item{padding-left:5px;} QTableView::item:selected{border:1px solid rgb(70,130,180);}");
|
||||
m_tableView->verticalHeader()->setVisible(false);
|
||||
m_tableView->setFocusPolicy(Qt::NoFocus); //避免视图抢Editor的焦点
|
||||
m_tableView->setTabKeyNavigation(false); //关闭tab键导航
|
||||
m_tableView->setTabKeyNavigation(false); //关闭tab键导航,对自定义Eidtor设置焦点时(比如lineEdit)会触发tab键,目前尚未清楚为什么
|
||||
|
||||
m_attributeTableModel = new AttributeTableModel(m_modelAttributeGroup, this, m_connection, m_attributeTable);
|
||||
m_tableView->setModel(m_attributeTableModel);
|
||||
|
|
|
|||
|
|
@ -1,62 +0,0 @@
|
|||
#include "attributeView.h"
|
||||
#include "attributeTableDelegate.h"
|
||||
#include "multiLineHeaderView.h"
|
||||
#include <QHeaderView>
|
||||
#include <QVBoxLayout>
|
||||
#include <QTimer>
|
||||
|
||||
AttributeView::AttributeView(const ModelAttributeGroup& modelAttributeGroup, QWidget* parent, const QString& connection, const QString& tableName)
|
||||
: QWidget(parent)
|
||||
, m_connection(connection)
|
||||
, m_attributeTable(tableName)
|
||||
, m_modelAttributeGroup(modelAttributeGroup)
|
||||
{
|
||||
m_tableView = new QTableView(this);
|
||||
m_tableView->setStyleSheet("QTableView::item{padding-left:5px;} QTableView::item:selected{border:1px solid rgb(70,130,180);}");
|
||||
m_tableView->verticalHeader()->setVisible(false);
|
||||
|
||||
m_tableView->setTabKeyNavigation(false); //关闭tab键导航
|
||||
|
||||
m_attributeTableModel = new AttributeTableModel(m_modelAttributeGroup, this, m_connection, m_attributeTable);
|
||||
m_tableView->setModel(m_attributeTableModel);
|
||||
|
||||
m_attributeTableDelegate = new AttributeTableDelegate(m_tableView, m_connection, m_tableView);
|
||||
m_tableView->setItemDelegate(m_attributeTableDelegate);
|
||||
|
||||
//自定义表头
|
||||
m_multiLinHeader = new MultiLineHeaderView(Qt::Horizontal, this);
|
||||
QColor bg(246, 246, 246);
|
||||
QColor border(228, 228, 228);
|
||||
m_multiLinHeader->setBackgroundColor(bg);
|
||||
m_multiLinHeader->setBorderColor(border);
|
||||
//主标题加粗展示
|
||||
for(int i =0; i < m_attributeTableModel->columnCount(); i++)
|
||||
{
|
||||
HeaderLineStyle mainTitleStyle;
|
||||
mainTitleStyle.font.setBold(true);
|
||||
m_multiLinHeader->setSectionLineStyle(i, 0, mainTitleStyle);
|
||||
HeaderLineStyle subTitleStyle;
|
||||
//subTitleStyle.font.setPointSize(8);
|
||||
m_multiLinHeader->setSectionLineStyle(i, 1, subTitleStyle);
|
||||
}
|
||||
m_tableView->setHorizontalHeader(m_multiLinHeader);
|
||||
//除了第一列其余列恢复可以手动调整模式
|
||||
QTimer::singleShot(1000, this, [=](){
|
||||
for(int i = 1; i < m_multiLinHeader->count(); i++)
|
||||
m_multiLinHeader->setSectionResizeMode(i, QHeaderView::Interactive);
|
||||
});
|
||||
|
||||
m_vLayout = new QVBoxLayout(this);
|
||||
m_vLayout->setSpacing(0);
|
||||
m_vLayout->setContentsMargins(0, 0, 0, 0);
|
||||
m_vLayout->addWidget(m_tableView);
|
||||
this->setLayout(m_vLayout);
|
||||
}
|
||||
|
||||
AttributeView::~AttributeView()
|
||||
{}
|
||||
|
||||
void AttributeView::active()
|
||||
{
|
||||
m_attributeTableModel->triggerSyncSignal();
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
#include "mainwindow.h"
|
||||
#include "./ui_mainwindow.h"
|
||||
|
||||
#include "maskManager.h"
|
||||
#include "dbManager.h"
|
||||
#include "dbBrowser.h"
|
||||
#include "connectionDialog.h"
|
||||
|
|
@ -16,7 +16,6 @@
|
|||
MainWindow::MainWindow(QWidget *parent)
|
||||
: QMainWindow(parent)
|
||||
, ui(new Ui::MainWindow)
|
||||
, m_maskLayer(nullptr)
|
||||
, m_dbManager(nullptr)
|
||||
, m_dbBrowser(nullptr)
|
||||
, m_pMessageDialog(nullptr)
|
||||
|
|
@ -53,8 +52,6 @@ bool MainWindow::eventFilter(QObject* obj, QEvent* event)
|
|||
|
||||
void MainWindow::resizeEvent(QResizeEvent* event)
|
||||
{
|
||||
if(m_maskLayer)
|
||||
m_maskLayer->setGeometry(0, 0, width(), height());
|
||||
QWidget::resizeEvent(event);
|
||||
}
|
||||
|
||||
|
|
@ -68,10 +65,7 @@ void MainWindow::initialize()
|
|||
|
||||
connect(&SqlQueryExecutor::instance(), &SqlQueryExecutor::errorOccurred, this, &MainWindow::onSIG_errorFormSQLExecutor);
|
||||
|
||||
m_maskLayer = new QWidget(this);
|
||||
//m_maskLayer->setAttribute(Qt::WA_TransparentForMouseEvents, true);
|
||||
m_maskLayer->setStyleSheet("background:rgba(112,128,144,180);");
|
||||
m_maskLayer->hide();
|
||||
MaskManager::initialize(this);
|
||||
|
||||
m_dbManager = new DatabaseManager(this);
|
||||
connect(m_dbManager, &DatabaseManager::errorOccurred, this, &MainWindow::onSIG_errorFromDBManger);
|
||||
|
|
@ -103,18 +97,6 @@ void MainWindow::initialize()
|
|||
// ui->splitter->setStretchFactor(1, 7);
|
||||
}
|
||||
|
||||
void MainWindow::showMaskLayer()
|
||||
{
|
||||
m_maskLayer->setGeometry(0, 0, width(), height());
|
||||
m_maskLayer->raise();
|
||||
m_maskLayer->show();
|
||||
}
|
||||
|
||||
void MainWindow::hideMaskLayer()
|
||||
{
|
||||
m_maskLayer->hide();
|
||||
}
|
||||
|
||||
void MainWindow::showMessageDialog(MessageDialogType type,const QString& strTitle,const QString& strContent)
|
||||
{
|
||||
if(m_pMessageDialog == nullptr)
|
||||
|
|
@ -133,9 +115,9 @@ void MainWindow::showMessageDialog(MessageDialogType type,const QString& strTitl
|
|||
// else
|
||||
// m_pMessageDialog->show();
|
||||
|
||||
//showMaskLayer();
|
||||
MaskManager::instance()->showMask(m_pMessageDialog);
|
||||
m_pMessageDialog->exec();
|
||||
//hideMaskLayer();
|
||||
MaskManager::instance()->hideMask(m_pMessageDialog);
|
||||
}
|
||||
void MainWindow::hideMessageDialog()
|
||||
{
|
||||
|
|
@ -177,9 +159,9 @@ void MainWindow::onActionTrigger_connect()
|
|||
// centerPos -= QPoint(m_pConnectionDialog->width()/2, m_pConnectionDialog->height()/2);
|
||||
// m_pConnectionDialog->move(centerPos);
|
||||
|
||||
//showMaskLayer();
|
||||
MaskManager::instance()->showMask(m_pConnectionDialog);
|
||||
m_pConnectionDialog->exec();
|
||||
//hideMaskLayer();
|
||||
MaskManager::instance()->hideMask(m_pConnectionDialog);
|
||||
}
|
||||
void MainWindow::onActionTrigger_disconnect()
|
||||
{
|
||||
|
|
@ -205,9 +187,9 @@ void MainWindow::onActionTrigger_addModel()
|
|||
m_pModelInfoDialog->move(nX, nY);
|
||||
m_pModelInfoDialog->setState(DS_New);
|
||||
|
||||
//showMaskLayer();
|
||||
MaskManager::instance()->showMask(m_pModelInfoDialog);
|
||||
m_pModelInfoDialog->exec();
|
||||
//hideMaskLayer();
|
||||
MaskManager::instance()->hideMask(m_pModelInfoDialog);
|
||||
}
|
||||
void MainWindow::onActionTrigger_removeModel()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,56 @@
|
|||
#include "maskManager.h"
|
||||
#include <QEvent>
|
||||
|
||||
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* requseter)
|
||||
{
|
||||
if(m_activeRequsets.isEmpty())
|
||||
{
|
||||
m_maskLayer->setGeometry(m_mainWindow->rect());
|
||||
//m_maskLayer->raise(); //显示在最上层,后续打开的同级子窗口依然在其之上
|
||||
m_maskLayer->show();
|
||||
}
|
||||
m_activeRequsets.insert(requseter);
|
||||
}
|
||||
|
||||
void MaskManager::hideMask(QWidget* requester)
|
||||
{
|
||||
m_activeRequsets.remove(requester);
|
||||
if(m_activeRequsets.isEmpty())
|
||||
m_maskLayer->hide();
|
||||
}
|
||||
Loading…
Reference in New Issue