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
|