From 3916dc551533bc0b944d0cd1ff210d442c34c00a Mon Sep 17 00:00:00 2001 From: duanshengchao <519970194@qq.com> Date: Mon, 21 Apr 2025 14:29:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E3=80=81=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E9=81=AE=E7=BD=A9=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 2 ++ include/connectionDialog.h | 5 +++++ include/groupSelectionDialog.h | 5 +++++ include/maskLayer.h | 18 +++++++++++++++++ include/maskManager.h | 1 + include/modelInfoEditDialog.h | 5 +++++ source/connectionDialog.cpp | 13 +++++++++++++ source/groupSelectionDialog.cpp | 13 +++++++++++++ source/maskLayer.cpp | 26 +++++++++++++++++++++++++ source/maskManager.cpp | 34 ++++++++++++++++++++++++--------- source/modelInfoEditDialog.cpp | 12 ++++++++++++ 11 files changed, 125 insertions(+), 9 deletions(-) create mode 100644 include/maskLayer.h create mode 100644 source/maskLayer.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 42a88db..23ed543 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,7 @@ set(H_HEADER_FILES include/attributeTableDelegate.h include/attributeView.h include/attributeSelector.h + include/maskLayer.h include/maskManager.h include/customBorderContainer.h include/groupSelectionDialog.h @@ -69,6 +70,7 @@ set(CPP_SOURCE_FILES source/attributeTableDelegate.cpp source/attributeView.cpp source/attributeSelector.cpp + source/maskLayer.cpp source/maskManager.cpp source/customBorderContainer.cpp source/groupSelectionDialog.cpp diff --git a/include/connectionDialog.h b/include/connectionDialog.h index c20f65a..ce20e0d 100644 --- a/include/connectionDialog.h +++ b/include/connectionDialog.h @@ -12,6 +12,7 @@ class ConnectionDialog; QT_END_NAMESPACE class MainWindow; +class MaskLayer; class CustomBorderContainer; class ConnectionDialog : public QDialog @@ -26,6 +27,9 @@ public: void setErrorInfo(const QString&); void clearErrorInfo(); + Q_INVOKABLE void showMask(); + Q_INVOKABLE void hideMask(); + protected: virtual void showEvent(QShowEvent*); virtual void closeEvent(QCloseEvent*); @@ -38,6 +42,7 @@ private: void loadConnInfo(const QString&); Ui::ConnectionDialog *ui; + MaskLayer* m_pMaskLayer; MainWindow* m_pMainWindow; bool m_isNewStatus;//是否是新建链接编辑状态 int m_curConnListRow; diff --git a/include/groupSelectionDialog.h b/include/groupSelectionDialog.h index 7ef60bb..f9a5b1d 100644 --- a/include/groupSelectionDialog.h +++ b/include/groupSelectionDialog.h @@ -9,6 +9,7 @@ class GroupSelectionDialog; } QT_END_NAMESPACE +class MaskLayer; class MainWindow; class QListWidgetItem; class CustomBorderContainer; @@ -24,10 +25,14 @@ public: void setMainWindow(MainWindow*); void setModel(int); + Q_INVOKABLE void showMask(); + Q_INVOKABLE void hideMask(); + private: void initialize(); Ui::GroupSelectionDialog* ui; + MaskLayer* m_pMaskLayer; MainWindow* m_pMainWindow; int m_curModelID; diff --git a/include/maskLayer.h b/include/maskLayer.h new file mode 100644 index 0000000..a65fef6 --- /dev/null +++ b/include/maskLayer.h @@ -0,0 +1,18 @@ +#ifndef MASKLAYER_H +#define MASKLAYER_H + +#include + +class MaskLayer : public QWidget +{ + Q_OBJECT + +public: + explicit MaskLayer(QWidget *parent = nullptr); + ~MaskLayer(); + +protected: + void paintEvent(QPaintEvent *event); +}; + +#endif //MASKLAYER_H diff --git a/include/maskManager.h b/include/maskManager.h index 539d3d8..ecb206c 100644 --- a/include/maskManager.h +++ b/include/maskManager.h @@ -59,6 +59,7 @@ public: T& operator[](int index) { return at(index); } }; +class MaskLayer; class MaskManager : public QObject { Q_OBJECT diff --git a/include/modelInfoEditDialog.h b/include/modelInfoEditDialog.h index b1e2133..b11f2a8 100644 --- a/include/modelInfoEditDialog.h +++ b/include/modelInfoEditDialog.h @@ -11,6 +11,7 @@ class ModelInfoEditDialog; QT_END_NAMESPACE class MainWindow; +class MaskLayer; class QListWidgetItem; class CustomBorderContainer; @@ -26,6 +27,9 @@ public: void setMainWindow(MainWindow*); void setModel(int); + Q_INVOKABLE void showMask(); + Q_INVOKABLE void hideMask(); + protected: virtual void showEvent(QShowEvent*); @@ -37,6 +41,7 @@ private: Ui::ModelInfoEditDialog* ui; DialogState m_state; + MaskLayer* m_pMaskLayer; MainWindow* m_pMainWindow; int m_curModelID; diff --git a/source/connectionDialog.cpp b/source/connectionDialog.cpp index 51dbc53..55cd4f5 100644 --- a/source/connectionDialog.cpp +++ b/source/connectionDialog.cpp @@ -1,5 +1,6 @@ #include "connectionDialog.h" #include "./ui_connectionDialog.h" +#include "maskLayer.h" #include "mainwindow.h" #include "settings.h" #include "tableWidgetHoverDelegate.h" @@ -78,6 +79,8 @@ void ConnectionDialog::initialize() m_isNewStatus = false; m_curConnListRow = -1; + m_pMaskLayer = new MaskLayer(this); + QIntValidator* validator = new QIntValidator(0, 9999, this); ui->lineEdit_port->setValidator(validator); @@ -229,6 +232,16 @@ void ConnectionDialog::clearErrorInfo() ui->label_error->setText(""); } +void ConnectionDialog::showMask() +{ + m_pMaskLayer->setGeometry(0, 0, this->width(), this->height()); + m_pMaskLayer->show(); +} +void ConnectionDialog::hideMask() +{ + m_pMaskLayer->close(); +} + void ConnectionDialog::onComboxChanged_dbType(const QString& text) { if(text == "PostgreSQL") diff --git a/source/groupSelectionDialog.cpp b/source/groupSelectionDialog.cpp index 426c1b5..bea7458 100644 --- a/source/groupSelectionDialog.cpp +++ b/source/groupSelectionDialog.cpp @@ -1,5 +1,6 @@ #include "groupSelectionDialog.h" #include "./ui_groupSelectionDialog.h" +#include "maskLayer.h" #include "mainwindow.h" #include "sqlQueryExecutor.h" #include "textColorPreserveDelegate.h" @@ -36,6 +37,8 @@ GroupSelectionDialog::~GroupSelectionDialog() void GroupSelectionDialog::initialize() { + m_pMaskLayer = new MaskLayer(this); + TextColorPreserveDelegate* delegate = new TextColorPreserveDelegate(this); ui->sourceList->setItemDelegate(delegate); ui->selectedList->setItemDelegate(delegate); @@ -92,6 +95,16 @@ void GroupSelectionDialog::setModel(int id) } } +void GroupSelectionDialog::showMask() +{ + m_pMaskLayer->setGeometry(0, 0, this->width(), this->height()); + m_pMaskLayer->show(); +} +void GroupSelectionDialog::hideMask() +{ + m_pMaskLayer->close(); +} + void GroupSelectionDialog::onBtnClicked_save() { if(!m_pMainWindow) diff --git a/source/maskLayer.cpp b/source/maskLayer.cpp new file mode 100644 index 0000000..99beba0 --- /dev/null +++ b/source/maskLayer.cpp @@ -0,0 +1,26 @@ +#include "maskLayer.h" +#include +#include + +MaskLayer::MaskLayer(QWidget *parent) + : QWidget(parent) +{ + setObjectName("maskLayer"); + setFocusPolicy(Qt::NoFocus); + setAttribute(Qt::WA_TranslucentBackground); // 启用透明背景 + setStyleSheet("background:rgba(112,128,144,180);"); + hide(); +} + +MaskLayer::~MaskLayer() +{} + +//重写paintEvent触发背景绘制,否则实例化对象不显示 +void MaskLayer::paintEvent(QPaintEvent *event) +{ + QStyleOption opt; + opt.initFrom(this); + QPainter p(this); + style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); + QWidget::paintEvent(event); +} diff --git a/source/maskManager.cpp b/source/maskManager.cpp index 34ae5fc..6b6e6b3 100644 --- a/source/maskManager.cpp +++ b/source/maskManager.cpp @@ -1,7 +1,9 @@ #include "maskManager.h" +#include "maskLayer.h" #include #include #include +#include MaskManager* MaskManager::m_instance = nullptr; @@ -21,12 +23,9 @@ 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_maskLayer = new MaskLayer(m_mainWindow); + // m_maskLayer->setStyleSheet("background:rgba(112,128,144,180);"); + // m_maskLayer->hide(); m_mainWindow->installEventFilter(this); //在Qt中,时间过滤会按照install的顺序反向执行,过程中,对于同一类型事件,任何一个过滤器返回true,表示事件被处理,后续过滤器和事件函数不会再被调用 } @@ -46,11 +45,24 @@ void MaskManager::showMask(QWidget* requester) { 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(); - if(widget->parentWidget() == m_mainWindow && widget->isVisible() && !widget->isModal()) + 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()) @@ -64,7 +76,7 @@ void MaskManager::showMask(QWidget* requester) //强制刷新 //m_mainWindow->update(); //QApplication::processEvents(); - } + }*/ } m_activeRequests.appendUnique(requester); @@ -79,7 +91,11 @@ void MaskManager::hideMask(QWidget* requester) else { QWidget* widget = m_activeRequests.last(); - widget->raise(); + 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(); diff --git a/source/modelInfoEditDialog.cpp b/source/modelInfoEditDialog.cpp index 2e35d4e..644ad39 100644 --- a/source/modelInfoEditDialog.cpp +++ b/source/modelInfoEditDialog.cpp @@ -1,5 +1,6 @@ #include "modelInfoEditDialog.h" #include "./ui_modelInfoEditDialog.h" +#include "maskLayer.h" #include "mainwindow.h" #include "sqlQueryExecutor.h" #include "textColorPreserveDelegate.h" @@ -53,6 +54,7 @@ void ModelInfoEditDialog::initialize() m_state = DS_New; m_curModelID = -1; ui->btnAddGroup->setVisible(false); + m_pMaskLayer = new MaskLayer(this); //正则表达式,只能属于字母 QRegularExpression regExp("[A-Za-z0-9]+"); QRegularExpressionValidator* validator = new QRegularExpressionValidator(regExp, this); @@ -125,6 +127,16 @@ void ModelInfoEditDialog::setModel(int id) m_curModelID = id; } +void ModelInfoEditDialog::showMask() +{ + m_pMaskLayer->setGeometry(0, 0, this->width(), this->height()); + m_pMaskLayer->show(); +} +void ModelInfoEditDialog::hideMask() +{ + m_pMaskLayer->close(); +} + void ModelInfoEditDialog::onItemDblCliked_sourceList(QListWidgetItem* item) { if(item->data(Qt::UserRole + itemRole_isPublic).toBool())