97 lines
2.5 KiB
C++
97 lines
2.5 KiB
C++
/**
|
||
*\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
|