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