/ dlgresize.h
#pragma once
#include <QtCore/QtCore>
#include <QtGui/QtGui>
enum {LEFT, RIGHT, TOP, BOTTOM,LEFTTOP,RIGHTTOP,LEFTBOTTOM,RIGHTBOTTOM};
class Dlg:public QWidget
{
Q_OBJECT
public:
Dlg(QWidget *parent = 0);
protected:
virtual void paintEvent ( QPaintEvent * event );
virtual void mouseMoveEvent ( QMouseEvent * event );
virtual void mousePressEvent ( QMouseEvent * event );
virtual void mouseReleaseEvent( QMouseEvent * event );
private:
int getSideType(QPoint point);
bool setCursorShape(int flag);
void changeRectSize(int flag,QPoint globalPos);
private:
QPoint m_movePoint; //移动的距离
bool m_pressMouse; //按下鼠标左键
bool m_changeRect; //窗口改变大小
bool m_curChanged; //鼠标形状改变
int m_curShape; //鼠标形状
int m_minWidth;
int m_minHeight;
};
dlgresize.cpp
#include "DlgResize.h"
Dlg::Dlg( QWidget *parent /*= 0*/ )
:QWidget(parent)
,m_pressMouse(false)
,m_changeRect(false)
,m_curChanged(false)
,m_curShape(0)
,m_minWidth(100)
,m_minHeight(25)
{
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
setMouseTracking(true);
setMinimumSize(m_minWidth,m_minHeight);
}
void Dlg::mouseMoveEvent( QMouseEvent * event )
{
if (m_pressMouse) //移动窗口
{
QPoint movePos = event->globalPos();
move(movePos - m_movePoint);
}
else //改变窗口大小
{
if (!m_changeRect) //如果没按下鼠标左键, 判断是否在边框 (主要是为了按下鼠标后不要再验证鼠标形状了)
{
m_curShape = getSideType(event->pos());
m_curChanged = setCursorShape(m_curShape);
}
else
{
changeRectSize(m_curShape,event->pos());
}
}
}
void Dlg::mousePressEvent( QMouseEvent * event )
{
if (event->button() == Qt::LeftButton) //只能是鼠标左键移动和改变大小
{
m_pressMouse = true;
if (m_curChanged)
{
m_changeRect = true;
m_pressMouse = false; //防止整个窗口移动
}
}
m_movePoint = event->globalPos() - pos(); //窗口移动距离
}
void Dlg::mouseReleaseEvent( QMouseEvent * event )
{
m_pressMouse = false;
m_changeRect = false;
}
void Dlg::paintEvent( QPaintEvent * event )
{
QPainter painter(this);
painter.fillRect(this->rect(),QColor(0,0,250,50));
}
int Dlg::getSideType( QPoint point )
{
int lenth = 5; //设置判断指针的距离
if (point.x()<=this->rect().left()+lenth)
{
if (point.y()>=this->rect().bottom()-lenth)
{
return LEFTBOTTOM;
}
else if (point.y()<=this->rect().top()+lenth)
{
return LEFTTOP;
}
return LEFT;
}
else if (point.x()>=this->rect().right()-lenth)
{
if (point.y()>=this->rect().bottom()-lenth)
{
return RIGHTBOTTOM;
}
else if (point.y()<=this->rect().top()+lenth)
{
return RIGHTTOP;
}
return RIGHT;
}
else if (point.y()<=this->rect().top()+lenth)
{
return TOP;
}
else if (point.y()>=this->rect().bottom()-lenth)
{
return BOTTOM;
}
return -1;
}
bool Dlg::setCursorShape( int flag )
{
QCursor curType;
bool shapeChanged = false;
switch (flag)
{
case LEFT:
case RIGHT:
curType = Qt::SizeHorCursor;
shapeChanged = true;
break;
case TOP:
case BOTTOM:
curType = Qt::SizeVerCursor;
shapeChanged = true;
break;
case LEFTTOP:
case RIGHTBOTTOM:
curType = Qt::SizeFDiagCursor;
shapeChanged = true;
break;
case RIGHTTOP:
case LEFTBOTTOM:
curType = Qt::SizeBDiagCursor;
shapeChanged = true;
break;
default:
curType = Qt::ArrowCursor;
break;
}
this->setCursor(curType);
return shapeChanged;
}
void Dlg::changeRectSize( int flag ,QPoint globalPos)
{
//QPoint temp = mapToParent(this->pos());
globalPos = mapToParent(globalPos);
int globalX = globalPos.x();
int globalY = globalPos.y();
int widgetX = this->pos().x();
int widgetY = this->pos().y();
int LMLenght = widgetX+this->width() - globalX; //左移距离
int RMLenght = globalX - widgetX +1;
int TMLenght = widgetY + this->height() - globalY;
int BMLenght = globalY - widgetY +1;
if (LMLenght<=m_minWidth) //防止向右最小时窗口移动
{
globalX = this->pos().x();
}
if (TMLenght<=m_minHeight) //防止向下最小时窗口时移动
{
globalY = this->pos().y();
}
switch (flag)
{
case LEFT:
setGeometry(globalX,widgetY,LMLenght,this->height());
break;
case RIGHT:
setGeometry(widgetX,widgetY,RMLenght,this->height());
break;
case TOP:
setGeometry(widgetX,globalY,this->width(),TMLenght);
break;
case BOTTOM:
setGeometry(widgetX,widgetY,this->width(),BMLenght);
break;
case LEFTTOP:
setGeometry(globalX,globalY,LMLenght,TMLenght);
break;
case LEFTBOTTOM:
setGeometry(globalX,widgetY,LMLenght,BMLenght);
break;
case RIGHTTOP:
setGeometry(widgetX,globalY,RMLenght,TMLenght);
break;
case RIGHTBOTTOM:
setGeometry(widgetX,widgetY,RMLenght,BMLenght);
break;
default:
break;
}
}