From 4c064524f2dc28a754b71f0da530ee7515e315e5 Mon Sep 17 00:00:00 2001 From: duanshengchao <519970194@qq.com> Date: Mon, 14 Apr 2025 12:10:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0MaskManager=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=EF=BC=8C=E5=AE=9E=E7=8E=B0=E4=B8=BB=E7=AA=97=E5=8F=A3=E9=81=AE?= =?UTF-8?q?=E7=BD=A9=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 2 + include/mainwindow.h | 3 -- include/maskManager.h | 30 +++++++++++++++ source/attributeTableDelegate.cpp | 4 -- source/attributeView.cpp | 3 +- source/attributeView.cpp.autosave | 62 ------------------------------- source/mainwindow.cpp | 34 ++++------------- source/maskManager.cpp | 56 ++++++++++++++++++++++++++++ 8 files changed, 97 insertions(+), 97 deletions(-) create mode 100644 include/maskManager.h delete mode 100644 source/attributeView.cpp.autosave create mode 100644 source/maskManager.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index b06ceba..e3ebd0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/include/mainwindow.h b/include/mainwindow.h index bc45bc2..d367314 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -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; diff --git a/include/maskManager.h b/include/maskManager.h new file mode 100644 index 0000000..4f93a5d --- /dev/null +++ b/include/maskManager.h @@ -0,0 +1,30 @@ +#ifndef MASKMANAGER_H +#define MASKMANAGER_H + +#include +#include + +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 m_activeRequsets; +}; + +#endif //MASKMANAGER_H diff --git a/source/attributeTableDelegate.cpp b/source/attributeTableDelegate.cpp index e50409a..3053066 100644 --- a/source/attributeTableDelegate.cpp +++ b/source/attributeTableDelegate.cpp @@ -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 = ""; diff --git a/source/attributeView.cpp b/source/attributeView.cpp index cac5e95..bab7849 100644 --- a/source/attributeView.cpp +++ b/source/attributeView.cpp @@ -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); diff --git a/source/attributeView.cpp.autosave b/source/attributeView.cpp.autosave deleted file mode 100644 index fa64dc9..0000000 --- a/source/attributeView.cpp.autosave +++ /dev/null @@ -1,62 +0,0 @@ -#include "attributeView.h" -#include "attributeTableDelegate.h" -#include "multiLineHeaderView.h" -#include -#include -#include - -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(); -} diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index 7d1aac3..6044f8d 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -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() { diff --git a/source/maskManager.cpp b/source/maskManager.cpp new file mode 100644 index 0000000..e503b62 --- /dev/null +++ b/source/maskManager.cpp @@ -0,0 +1,56 @@ +#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* 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(); +}