添加customBorderContainer和maskManager公共组件模块

This commit is contained in:
duanshengchao 2025-04-15 16:39:36 +08:00
parent 7eb8f913e7
commit b325b5f2e1
9 changed files with 326 additions and 18 deletions

View File

@ -40,6 +40,7 @@ set(H_HEADER_FILES
include/attributeView.h
include/attributeSelector.h
include/maskManager.h
include/customBorderContainer.h
)
set(CPP_SOURCE_FILES
@ -66,6 +67,7 @@ set(CPP_SOURCE_FILES
source/attributeView.cpp
source/attributeSelector.cpp
source/maskManager.cpp
source/customBorderContainer.cpp
)
set(UI_FILES

View File

@ -24,6 +24,16 @@ class AttributeTableModel : public QAbstractTableModel
Q_OBJECT
public:
enum EditStateFlag
{
Clean = 0, // 二进制: 0b0000
Modified = 1 << 0, // 二进制: 0b0001
New = 1 << 1, // 二进制: 0b0010
Deleted = 1 << 2 // 二进制: 0b0100
};
//创建 QFlags 包装类型
Q_DECLARE_FLAGS(EditState, EditStateFlag)
struct DataType //数据类型
{
int id;
@ -114,4 +124,7 @@ private:
QHash<QString, int> m_reversalDataTypes; //dataType的反转用来通过名称快速查找对应id
};
//生成运算符重载
Q_DECLARE_OPERATORS_FOR_FLAGS(AttributeTableModel::EditState)
#endif //ATTRIBUTETABLEMODEL_H

View File

@ -12,6 +12,7 @@ class ConnectionDialog;
}
QT_END_NAMESPACE
class CustomBorderContainer;
class ConnectionDialog : public QDialog
{
Q_OBJECT
@ -40,6 +41,8 @@ private:
bool m_isNewStatus;//是否是新建链接编辑状态
int m_curConnListRow;
CustomBorderContainer* m_customBorderContainer;
signals:
void addConnection(DatabaseConfig&);

View File

@ -0,0 +1,96 @@
/**
*\brief widget上widget的缩放
*
*\author dsc
*/
#ifndef CUSTOMBORDERCONTAINER_H
#define CUSTOMBORDERCONTAINER_H
#include <QWidget>
#include <QObject>
#include <QLabel>
#include <QMouseEvent>
#include <QBasicTimer>
class CustomBorderContainer : public QObject
{
Q_OBJECT
public:
enum borderType
{
border_left = 0,
border_right,
border_top,
border_bottom,
border_leftTop,
border_leftBottom,
border_rightTop,
border_rightBottom,
border_move
};
enum OperationOption
{
NoOperation = 0, // 二进制: 0b0000
Movable = 1 << 0, // 二进制: 0b0001
Resizable = 1 << 1, // 二进制: 0b0010
DefaultOperation = Movable | Resizable
};
//创建 QFlags 包装类型
Q_DECLARE_FLAGS(OperationOptions, OperationOption)
explicit CustomBorderContainer(QWidget* parent, QSize minimumSize = QSize(50, 50), int borderSize = 3);
~CustomBorderContainer();
void setMinimumWindowSize(QSize);
void setBorderSize(int);
void setOperationOptions(OperationOptions);
void updateBorder();
void updateContentWidget();
private:
//内部类
class Border : public QLabel
{
public:
explicit Border(QWidget* parent, borderType type, CustomBorderContainer* container);
protected:
void mousePressEvent(QMouseEvent*);
void mouseMoveEvent(QMouseEvent*);
void mouseReleaseEvent(QMouseEvent*);
void timerEvent(QTimerEvent*);
private:
borderType m_type;
QPoint m_mouseLastPoint;
QPoint m_mouseMoveLength;
bool m_mouseIsPressed;
CustomBorderContainer* m_contaniner;
QBasicTimer m_repaintTimer;
};
void initializeBorder();
void scaleByCustomBorder(borderType, const QPoint&);
QWidget* m_contentWidget;
QSize m_minimumSize;
int m_borderSize;
//borders
Border* m_borderLeft;
Border* m_borderRight;
Border* m_borderTop;
Border* m_borderBottom;
Border* m_borderLeftTop;
Border* m_borderLeftBottom;
Border* m_borderRightTop;
Border* m_borderRightBottom;
Border* m_borderMove; //用于移动的border
OperationOptions m_operationOptions;
};
//生成运算符重载(不能放在类的内部)
Q_DECLARE_OPERATORS_FOR_FLAGS(CustomBorderContainer::OperationOptions)
#endif //CUSTOMBORDERCONTAINER_H

View File

@ -11,18 +11,6 @@ enum DialogState
DS_Edit
};
enum EditStateFlag
{
Clean = 0, // 二进制: 0b0000
Modified = 1 << 0, // 二进制: 0b0001
New = 1 << 1, // 二进制: 0b0010
Deleted = 1 << 2 // 二进制: 0b0100
};
//创建 QFlags 包装类型
Q_DECLARE_FLAGS(EditState, EditStateFlag)
//生成运算符重载
Q_DECLARE_OPERATORS_FOR_FLAGS(EditState)
struct DatabaseConfig
{
QString strID; //存储在配置文件时用作唯一标识

View File

@ -24,7 +24,7 @@ private:
static MaskManager* m_instance;
QWidget* m_mainWindow;
QWidget* m_maskLayer;
QSet<QWidget*> m_activeRequsets;
QSet<QWidget*> m_activeRequests;
};
#endif //MASKMANAGER_H

View File

@ -3,6 +3,7 @@
#include "mainwindow.h"
#include "settings.h"
#include "tableWidgetHoverDelegate.h"
#include "customBorderContainer.h"
#include <QDateTime>
#define itemID 1
@ -18,6 +19,9 @@ ConnectionDialog::ConnectionDialog(QWidget *parent)
//Linux下默认的Qt::Dialog即使有父窗口也无法按照子窗口的行为进行展示并且最大、最小按钮不好关闭因此需要去掉Dialog属性随之而来的问题是模态无法起作用
setWindowFlags(windowFlags() & ~Qt::Dialog);
setStyleSheet("QDialog{border: 1px solid rgb(205,205,205);border-radius:5px;background-color:rgb(245,245,245);}");
m_customBorderContainer = new CustomBorderContainer(this);
m_customBorderContainer->setOperationOptions(CustomBorderContainer::Movable | CustomBorderContainer::Resizable);
}
else
{

View File

@ -0,0 +1,202 @@
#include "customBorderContainer.h"
#include <QPainter>
//Class Border
CustomBorderContainer::Border::Border(QWidget* parent, borderType type, CustomBorderContainer* container)
: QLabel(parent)
, m_type(type)
, m_contaniner(container)
{
switch(m_type)
{
case border_left:
case border_right:
setCursor(Qt::SizeHorCursor);
break;
case border_top:
case border_bottom:
setCursor(Qt::SizeVerCursor);
break;
case border_leftTop:
case border_rightBottom:
setCursor(Qt::SizeFDiagCursor);
break;
case border_rightTop:
case border_leftBottom:
setCursor(Qt::SizeBDiagCursor);
break;
default:
setCursor(Qt::ArrowCursor);
break;
}
}
void CustomBorderContainer::Border::mousePressEvent(QMouseEvent* event)
{
if(m_contaniner->m_operationOptions == NoOperation)
return;
if(event->button() != Qt::LeftButton)
return;
m_mouseIsPressed = true;
m_mouseLastPoint = event->globalPosition().toPoint();
QLabel::mousePressEvent(event);
}
void CustomBorderContainer::Border::mouseMoveEvent(QMouseEvent* event)
{
if(m_mouseIsPressed)
{
m_mouseMoveLength = event->globalPosition().toPoint() - m_mouseLastPoint;
m_contaniner->scaleByCustomBorder(m_type, m_mouseMoveLength);
m_mouseLastPoint = event->globalPosition().toPoint();
}
QLabel::mouseMoveEvent(event);
}
void CustomBorderContainer::Border::mouseReleaseEvent(QMouseEvent* event)
{
Q_UNUSED(event)
m_mouseIsPressed = false;
m_contaniner->updateBorder();
QLabel::mouseReleaseEvent(event);
}
void CustomBorderContainer::Border::timerEvent(QTimerEvent* event)
{
if(event->timerId() == m_repaintTimer.timerId())
{
m_repaintTimer.stop();
m_contaniner->updateContentWidget();
}
}
//Class CustomBorderContainer
CustomBorderContainer::CustomBorderContainer(QWidget *parent, QSize minimumSize, int borderSize)
: QObject(parent)
, m_contentWidget(parent)
, m_minimumSize(minimumSize)
, m_borderSize(borderSize)
{
m_operationOptions = NoOperation;
initializeBorder();
}
CustomBorderContainer::~CustomBorderContainer()
{}
void CustomBorderContainer::initializeBorder()
{
m_borderLeft = new Border(m_contentWidget, border_left, this);
m_borderLeft->setStyleSheet("background-color:transparent");
m_borderLeft->raise();
m_borderRight = new Border(m_contentWidget, border_right, this);
m_borderRight->setStyleSheet("background-color:transparent");
m_borderRight->raise();
m_borderTop = new Border(m_contentWidget, border_top, this);
m_borderTop->setStyleSheet("background-color:transparent");
m_borderTop->raise();
m_borderBottom = new Border(m_contentWidget, border_bottom, this);
m_borderBottom->setStyleSheet("background-color:transparent");
m_borderBottom->raise();
m_borderLeftTop = new Border(m_contentWidget, border_leftTop, this);
m_borderLeftTop->setStyleSheet("background-color:transparent");
m_borderLeftTop->raise();
m_borderLeftBottom = new Border(m_contentWidget, border_leftBottom, this);
m_borderLeftBottom->setStyleSheet("background-color:transparent");
m_borderLeftBottom->raise();
m_borderRightTop = new Border(m_contentWidget, border_rightTop, this);
m_borderRightTop->setStyleSheet("background-color:transparent");
m_borderRightTop->raise();
m_borderRightBottom = new Border(m_contentWidget, border_rightBottom, this);
m_borderRightBottom->setStyleSheet("background-color:transparent");
m_borderRightBottom->raise();
m_borderMove = new Border(m_contentWidget, border_move, this);
m_borderMove->setStyleSheet("background-color:transparent");
m_borderMove->raise();
updateBorder();
}
void CustomBorderContainer::scaleByCustomBorder(borderType type, const QPoint& moveLength)
{
switch (type)
{
case border_left:
m_contentWidget->setGeometry(m_contentWidget->pos().x() + moveLength.x(), m_contentWidget->pos().y(), m_contentWidget->width() - moveLength.x(), m_contentWidget->height());
break;
case border_right:
m_contentWidget->setGeometry(m_contentWidget->pos().x(), m_contentWidget->pos().y(), m_contentWidget->width() + moveLength.x(), m_contentWidget->height());
break;
case border_top:
m_contentWidget->setGeometry(m_contentWidget->pos().x(), m_contentWidget->pos().y() + moveLength.y(), m_contentWidget->width(), m_contentWidget->height() - moveLength.y());
break;
case border_bottom:
m_contentWidget->setGeometry(m_contentWidget->pos().x(), m_contentWidget->pos().y(), m_contentWidget->width(), m_contentWidget->height() + moveLength.y());
break;
case border_leftTop:
m_contentWidget->setGeometry(m_contentWidget->pos().x() + moveLength.x(), m_contentWidget->pos().y() + moveLength.y(), m_contentWidget->width() - moveLength.x(), m_contentWidget->height() - moveLength.y());
break;
case border_leftBottom:
m_contentWidget->setGeometry(m_contentWidget->pos().x() + moveLength.x(), m_contentWidget->pos().y(), m_contentWidget->width() - moveLength.x(), m_contentWidget->height() + moveLength.y());
break;
case border_rightTop:
m_contentWidget->setGeometry(m_contentWidget->pos().x(), m_contentWidget->pos().y() + moveLength.y(), m_contentWidget->width() + moveLength.x(), m_contentWidget->height() - moveLength.y());
break;
case border_rightBottom:
m_contentWidget->setGeometry(m_contentWidget->pos().x(), m_contentWidget->pos().y(), m_contentWidget->width() + moveLength.x(), m_contentWidget->height() + moveLength.y());
break;
case border_move:
m_contentWidget->move(moveLength + m_contentWidget->pos());
break;
default:
break;
}
//m_borderMove->setGeometry(m_borderSize, m_borderSize, m_contentWidget->width() - m_borderSize * 2, m_borderSize * 10);
}
void CustomBorderContainer::setMinimumWindowSize(QSize size)
{
m_minimumSize = size;
}
void CustomBorderContainer::setBorderSize(int size)
{
m_borderSize = size;
}
void CustomBorderContainer::setOperationOptions(OperationOptions options)
{
m_operationOptions = options;
}
void CustomBorderContainer::updateBorder()
{
m_borderLeft->setGeometry(0, m_borderSize, m_borderSize, m_contentWidget->height() - m_borderSize * 2);
m_borderTop->setGeometry(m_borderSize, 0, m_contentWidget->width() - m_borderSize * 2, m_borderSize);
m_borderRight->setGeometry(m_contentWidget->width() - m_borderSize, m_borderSize, m_borderSize, m_contentWidget->height() - m_borderSize * 2);
m_borderBottom->setGeometry(m_borderSize, m_contentWidget->height() - m_borderSize, m_contentWidget->width() - m_borderSize * 2, m_borderSize);
m_borderLeftTop->setGeometry(0, 0, m_borderSize, m_borderSize);
m_borderLeftBottom->setGeometry(0, m_contentWidget->height() - m_borderSize, m_borderSize, m_borderSize);
m_borderRightTop->setGeometry(m_contentWidget->width() - m_borderSize, 0, m_borderSize, m_borderSize);
m_borderRightBottom->setGeometry(m_contentWidget->width() - m_borderSize, m_contentWidget->height() - m_borderSize, m_borderSize, m_borderSize);
m_borderMove->setGeometry(m_borderSize, m_borderSize, m_contentWidget->width() - m_borderSize * 2, m_borderSize * 10);
}
void CustomBorderContainer::updateContentWidget()
{
m_contentWidget->update();
}

View File

@ -37,20 +37,20 @@ bool MaskManager::eventFilter(QObject* obj, QEvent* event)
return QObject::eventFilter(obj, event);
}
void MaskManager::showMask(QWidget* requseter)
void MaskManager::showMask(QWidget* requester)
{
if(m_activeRequsets.isEmpty())
if(m_activeRequests.isEmpty())
{
m_maskLayer->setGeometry(m_mainWindow->rect());
//m_maskLayer->raise(); //显示在最上层,后续打开的同级子窗口依然在其之上
m_maskLayer->show();
}
m_activeRequsets.insert(requseter);
m_activeRequests.insert(requester);
}
void MaskManager::hideMask(QWidget* requester)
{
m_activeRequsets.remove(requester);
if(m_activeRequsets.isEmpty())
m_activeRequests.remove(requester);
if(m_activeRequests.isEmpty())
m_maskLayer->hide();
}