qt实现去掉边框后的窗口移动、拉伸和靠边界隐藏

QT实现窗口去掉边框后的移动、拉伸和窗口隐藏

窗口移动和拉伸的思路

通过重写mousemove函数实现窗口的移动,但是在项目中不可能对每一个模块都进行函数重写,通过使用事件滤波器(eventfilter)来解决这个问题,在事件滤波器中判断事件类型,然后进行相应操作,窗口移动思想是当检测到事件为鼠标移动事件后通过move函数将窗口移动相应的dx和dy距离;窗口拉伸的思路是:仿照QSizeGrip类中源码的思想。先将窗口进行大小的改变,为了保持对边不变(即你移动某一个边时,另一个边要保持不变),将对边移动到原来的位置。

代码实现

qgrip.h/
#ifndef QGRIP_H
#define QGRIP_H

#include <QWidget>
#include<QObject>
#include<QMouseEvent>
#include<QDesktopWidget>

QT_BEGIN_NAMESPACE
enum ResizeRegion
{
    Default,
    North,
    NorthEast,
    East,
    SouthEast,
    South,
    SouthWest,
    West,
    NorthWest,
    Arrow
};
enum EdgeStatus{
    Eg_normal,
    Eg_top,
    Eg_left,
    Eg_right,
    Eg_bottom


};
class  QGrip : public QWidget
{
    Q_OBJECT
public:
     QGrip(QWidget *parent);
    ~QGrip();
    void updateTopLevelWidget();
    ResizeRegion resizeregion;
    QPoint p;
    QPoint dragPos;
    QRect r;
    int d;
    Qt::Corner m_corner;
    Qt::Edge m_edge;
    int resizeBorderWidth=10;
    Qt::Corner corner(QWidget*q,QMouseEvent*qe) const;
    Qt::Edge edge()const; 
    void hideWidget(QWidget*q,EdgeStatus es);//窗口隐藏
    void showWidget(QWidget*q,EdgeStatus es);//窗口显示
    EdgeStatus isDirection(QWidget *q);//判断窗口位置状态


protected:
    void paintEvent(QWidget*o,QPaintEvent *event,Qt::Corner m_corner);
    bool eventFilter(QObject *o, QEvent *e) Q_DECL_OVERRIDE;
    void setResizeCursor(QWidget*w,ResizeRegion region);
    ResizeRegion getResizeRegion(QWidget*w,QPoint clientPos);
private:
    EdgeStatus m_edgeStatus;
    int show_edgeWidth=8;
    QPoint inialPos;
    QPoint mousePos;
    QPoint mousePos2;

};


QT_END_NAMESPACE

#endif // QGRIP_H
//
qgrip.cpp
#include"qgrip.h"
#include<QPainter>
#include<QStyle>
#include<QStyleOption>
#include<iostream>
#include<QDesktopWidget>
#include<QLayout>
#include<QApplication>
#include<windows.h>
 QWidget *qt_sizegrip_topLevelWidget(QWidget* w)
    {
        while (w && !w->isWindow() && w->windowType() != Qt::SubWindow)
            w = w->parentWidget();
        return w;
    }
void QGrip::paintEvent(QWidget*o,QPaintEvent *event,Qt::Corner m_corner)
{
    QPainter painter
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值