Qt之MoveWindow类编写(可停靠桌面)

前言:

因为项目需求,现在要做一个窗口停靠功能,故集成于MoveWindow类中


功能需求:

  1. 自定义标签,自定义窗口按钮(关闭,缩小)
  2. 窗口停靠

代码:


enum Direction:quint16{
    Left = 0x1,
    Right = 0x2,
    Top = 0x4,
    Bottom =0x8,
    LeftTop = Left|Top,
    LeftBottom = Left|Bottom,
    RightTop = Right|Top,
    RightBottom = Right|Bottom,
    Disappear= 0x20,
     Error = 0x40,
    None = 0x80

};
Q_DECLARE_FLAGS(Directions,Direction)

 Q_DECLARE_OPERATORS_FOR_FLAGS(STOPEDGE::Directions)

}

Direction是方向

/**
 * @brief The MoveWindow class
 * @note 重写事件
 */
class MoveWindow :  public QWidget
{
    Q_OBJECT

public:
    explicit MoveWindow(QWidget *parent = nullptr);
    ~MoveWindow() {}

    /**
     * @brief setStopEdgeDirs
     * @brief 设置可停靠边
     * @param direction @type STOPEDGE::Directions
     * @example setStopEdgeDir(STOPEDGE::Direction::Top|STOPEDGE::Direction::Left);//设置桌面左边和上方停靠
     */
    void setStopEdgeDirs(STOPEDGE::Directions directions);
    /**
     * @brief setOverEdgeDirs
     * @brief 设置不可越界边
     * @param direction
     * @example setStopEdgeDirs(STOPEDGE::Direction::Bottom);//设置桌面下方不可越界
     */
    void setOverEdgeDirs(STOPEDGE::Directions directions);

    /**
     * @static
     *  @brief getStopEdgeDirs
     * @brief 获取停靠边
     * @param widget
     * @return STOPEDGE::Directions
     * @example <example>
     * using STOPEDGE::Directions;
     * Directions _directions = getStopEdgeDirs(this);
     * </example>
     * @author tangyoha
     */
    static STOPEDGE::Directions    getStopEdgeDirs(QWidget * widget);
    /**
     * @brief getOverEdgeDirs
     * @brief 获取越界边
     * @param widget
     * @param point @note 可选参数  @brief 为下一个窗口位置
     * @return
     * @author tangyoha
     * @example <example>
     * using STOPEDGE::Directions;
     * Directions _directions;
     * _directions = getOverEdgeDirs(this);
     * </example>
     */
    static STOPEDGE::Directions   getOverEdgeDirs(QWidget *widget,QPoint nextPos = QPoint(-1,-1));
    /**
     * @brief getScreensAt
     * @brief 获取widget所在屏幕
     * @return QScreen *
     * @example <example>
     * using STOPEDGE::Directions;
     * Directions _directions;
     * _directions = getOverScreensAt(this);
     */
    inline static auto getScreensAt(QWidget *) ->const QScreen*;
    bool isMouseInWidget(QWidget *widget,QPoint MousePos);
    bool getBStopEdge() const;
    void setBStopEdge(bool BStopEdge);

signals:
    void mainFormMoved(QPoint);//窗口移动了
    void overEdge(STOPEDGE::Direction);//窗口靠桌面边缘
    void rePosition(STOPEDGE::Directions);
public slots:
    void onStopEdgeChange(bool bStopEdgeChange);
    /**
     * @brief onMousePress
     * @brief 鼠标按下事件
     * @param event
     */
    void onMousePress(QMouseEvent * event);

    /**
     * @brief onMouseRelease
     * @brief 重写鼠标松开事件
     * @param event
     */
    void onMouseRelease(QMouseEvent *event);

    /**
     * @brief onMouseMove
     * @brief 重写鼠标移动事件
     * @param event
     */
    void  onMouseMove(QMouseEvent *event);


    void onEnter(QEvent *event);
    void onLeave(QEvent *event);
    void onActivationChange(QEvent *event);
    void onShow(QShowEvent *event);
private:
    bool isDragRect(QPoint point);//是否为可拖拽位置
    STOPEDGE::Directions m_OverEdge;
    STOPEDGE::Directions m_DStopEdge;

    //拖拽的坐标
    QPoint m_DragPosition;
    bool m_BStopEdge = false;//未停靠
protected:
    /**
     * @brief getDragWidget
     * @brief 由子类确定可拖拽的窗口位置
     * @return
     */

    /**
     * @brief getDragWidget
     * @return
     */
    virtual QWidget *getDragWidget() = 0;

    //是否可以移动
    bool bMoved;



protected slots:
    virtual void onWidgetStopEdge(STOPEDGE::Directions directions){Q_UNUSED(directions); }
    virtual void onThemeColorChange(QString colorStr){Q_UNUSED(colorStr)}
    virtual void onRePosition(STOPEDGE::Directions &directions){Q_UNUSED(directions);}
};

类的详情

未完待续。。。。

发布了8 篇原创文章 · 获赞 3 · 访问量 283

猜你喜欢

转载自blog.csdn.net/qq_42003391/article/details/104737237