/** *\brief 自定义边框容器类,可以挂载给任意采用无系统边框的widget上,进而实现widget的缩放、移动等功能 * *\author dsc */ #ifndef CUSTOMBORDERCONTAINER_H #define CUSTOMBORDERCONTAINER_H #include #include #include #include #include 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