qt 无边框窗口拉伸,可能是全网最精简的代码

这篇博客详细介绍了如何使用Qt框架为QMainWindow实现窗口边框拖拽和角落缩放功能。通过覆盖鼠标事件处理函数,如mousePressEvent、mouseMoveEvent和mouseReleaseEvent,以及使用QRubberBand类,开发者可以自定义窗口的行为,包括调整窗口大小和拖动窗口位置。此外,代码中还包含了设置边框宽度、启用/禁用拖拽和底部右角缩放功能的选项。

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

王婆卖瓜自卖自夸!废话少说,上代码,基于QMainWindow:

H:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QRubberBand>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
#define DEFAULT_CURSOR Qt::ArrowCursor
class MainWindow : public QMainWindow
{
    Q_OBJECT
    Q_PROPERTY(int m_borderWidth READ borderWidth WRITE setBorderWidth)
    Q_PROPERTY(bool m_dragEnable READ dragEnable WRITE setDragEnable)
    Q_PROPERTY(bool m_bottomRightResizeEnable READ bottomRightResizeEnable WRITE setBottomRightResizeEnable)
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    enum Edge {
            None = 0x0,
            Left = 0x1,
            Top = 0x2,
            Right = 0x4,
            Bottom = 0x8,
            TopLeft = Top|Left,
            TopRight = Top|Right,
            BottomLeft = Bottom|Left,
            BottomRight = Bottom|Right,
        };
    Q_DECLARE_FLAGS(Edges, Edge)

protected:
    bool eventFilter(QObject *o, QEvent *e) override;
    void leaveEvent(QEvent *event);
    void mousePressEvent(QMouseEvent*e);
    void hoverMoveEvent(QHoverEvent*);
    void mouseReleaseEvent(QMouseEvent*);
private:
    Qt::CursorShape calculateCursorPosition(const QPoint &, const QRect &, Edges &);
    void setBorderWidth(int w) {m_borderWidth = w;}
    int borderWidth() const {return m_borderWidth;}
    void setDragEnable(bool w) {m_dragEnable = w;}
    bool dragEnable() const {return m_dragEnable;}
    void setBottomRightResizeEnable(bool w) {m_bottomRightResizeEnable = w;}
    bool bottomRightResizeEnable() const {return m_bottomRightResizeEnable;}
private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
    void on_pushButton_3_clicked();

private:
    Ui::MainWindow *ui;

    QRect m_startRect;
    bool m_leftButtonPressed;
    Edges m_edgeOnMousePress = Edge::None;
    int m_borderWidth = 6;

    QPoint m_dragPos;
    bool m_dragStart = false,m_dragEnable = true;
    bool m_bottomRightResizeEnable = true;
};

#endif // MAINWINDOW_H

继续继续:

继续阅读

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值