优化、完善遮罩逻辑

This commit is contained in:
duanshengchao 2025-04-21 14:29:20 +08:00
parent 3d4fa337ca
commit 3916dc5515
11 changed files with 125 additions and 9 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;

18
include/maskLayer.h Normal file
View File

@ -0,0 +1,18 @@
#ifndef MASKLAYER_H
#define MASKLAYER_H
#include <QWidget>
class MaskLayer : public QWidget
{
Q_OBJECT
public:
explicit MaskLayer(QWidget *parent = nullptr);
~MaskLayer();
protected:
void paintEvent(QPaintEvent *event);
};
#endif //MASKLAYER_H

View File

@ -59,6 +59,7 @@ public:
T& operator[](int index) { return at(index); }
};
class MaskLayer;
class MaskManager : public QObject
{
Q_OBJECT

View File

@ -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;

View File

@ -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")

View File

@ -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)

26
source/maskLayer.cpp Normal file
View File

@ -0,0 +1,26 @@
#include "maskLayer.h"
#include <QPainter>
#include <QStyleOption>
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);
}

View File

@ -1,7 +1,9 @@
#include "maskManager.h"
#include "maskLayer.h"
#include <QEvent>
#include <QApplication>
#include <QDialog>
#include <QMetaMethod>
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<QDialog*>(child) || qobject_cast<QWidget*>(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();

View File

@ -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())