public:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
public:
int m_EdgeMargin;
private:
void CheckEdge();
private:
Ui::MonitorDisplay_Form *ui;
QPoint m_StartCursor;
int m_LeftOff = 0;//鼠标开始拖拽时子窗口左边相对父窗口左边的距离
int m_RightOff = 0;
int m_TopOff = 0;
int m_BottomOff = 0;
QPoint DragPosition;//鼠标拖动的位置
int EdgePosition;//鼠标检测的边缘距离
enum{
Nodir,
Top = 0x01,
Bottom = 0x02,
Left = 0x04,
Right = 0x08,
TopLeft = 0x01|0x04,
TopRight = 0x02|0x08,
BottomLeft = 0x02|0x04,
BottomRight = 0x02|0x08
}ResizeDir;
.cpp文件
void MonitorDisplay_Form::mousePressEvent(QMouseEvent *event)
{
event->ignore();
if(event->button()==Qt::LeftButton)//按下鼠标左键记录一次位置
{
DragPosition = event->globalPos()-frameGeometry().topLeft();//获得鼠标按键位置相对窗口左上面的位置
m_StartCursor = event->globalPos();
m_LeftOff = frameGeometry().left();
m_RightOff = frameGeometry().right();
m_TopOff = frameGeometry().top();
m_BottomOff = frameGeometry().bottom();
}
}
void MonitorDisplay_Form::mouseMoveEvent(QMouseEvent *event)
{
event->ignore();
if(event->button()& Qt::LeftButton)//如果左键按下
{
if(ResizeDir ==Nodir)//鼠标未放置在边缘出,进行窗口整体拖动处理
{
move(event->globalPos()-DragPosition);
}
else
{
int pTop,pBottom,pLeft,pRight;
pTop = m_TopOff;
pBottom = m_BottomOff;
pLeft = m_LeftOff;
pRight = m_RightOff;
if(ResizeDir & Top )//拖拽顶部上下变化
{
pTop = m_TopOff-(m_StartCursor.ry()-event->globalY());
if(this->height() <= minimumHeight())//进行极端最小值处理
{
pTop = Min(m_BottomOff-minimumHeight(),pTop);
}
else if(this->height() >=maximumHeight())
{
pTop = MAX(m_BottomOff-maximumHeight(),pTop);
}
}
else if(ResizeDir &Bottom)
{
pBottom = m_BottomOff+(event->globalY()-m_StartCursor.ry());
if(this->height() <= minimumHeight())//进行极端最小值处理
{
pBottom = m_TopOff+minimumHeight();
}
else if(this->height() >=maximumHeight())
{
pTop =m_TopOff+maximumHeight();
}
}
if(ResizeDir & Left )//拖拽顶部上下变化
{
pLeft = m_RightOff-(m_StartCursor.rx()-event->globalX());
if(this->width() <= minimumWidth())//进行极端最小值处理
{
pLeft = Min(pLeft,m_RightOff-minimumWidth());
}
else if(this->width() >=maximumWidth())
{
pLeft = MAX(m_RightOff-maximumWidth(),pLeft);
}
}
else if(ResizeDir &Right)
{
pRight = m_RightOff+(event->globalX()-m_StartCursor.rx());
if(this->width() <= minimumWidth())//进行极端最小值处理
{
pRight = m_LeftOff+minimumWidth();
}
else if(this->width() >=maximumWidth())
{
pRight =m_LeftOff+this->maximumWidth();
}
}
setGeometry(pLeft,pTop,pRight-pLeft,pBottom-pTop);
}
}
else {
CheckEdge();
}
}
void MonitorDisplay_Form::mouseReleaseEvent(QMouseEvent *event)
{
event->ignore();
if(ResizeDir != Nodir)//还原鼠标样式
{
CheckEdge();
}
}
void MonitorDisplay_Form::CheckEdge()
{
QPoint Pos = this->mapFromGlobal(QCursor::pos());
int DiffLeft = Pos.rx();
int DiffRight = this->width()-DiffLeft;
int DiffTop = Pos.ry();
int DiffBottom = this->height();-DiffTop;
QCursor TempCursor;
TempCursor = cursor();
if(DiffTop<m_EdgeMargin)
{
}
if(DiffTop < m_EdgeMargin)
{ //根据 边缘距离 分类改变尺寸的方向
if(DiffLeft < m_EdgeMargin)
{
ResizeDir = TopLeft;
TempCursor.setShape(Qt::SizeFDiagCursor);
}
else if(DiffRight < m_EdgeMargin)
{
ResizeDir = TopRight;
TempCursor.setShape(Qt::SizeBDiagCursor);
}
else
{
ResizeDir = Top;
TempCursor.setShape(Qt::SizeVerCursor);
}
}
else if(DiffBottom < m_EdgeMargin)
{
if(DiffLeft < m_EdgeMargin)
{
ResizeDir = BottomLeft;
TempCursor.setShape(Qt::SizeBDiagCursor);
}
else if(DiffRight < m_EdgeMargin)
{
ResizeDir = BottomRight;
TempCursor.setShape(Qt::SizeFDiagCursor);
}
else
{
ResizeDir = Bottom;
TempCursor.setShape(Qt::SizeVerCursor);
}
}
else if(DiffLeft < m_EdgeMargin)
{
ResizeDir = Left;
TempCursor.setShape(Qt::SizeHorCursor);
}
else if(DiffRight < m_EdgeMargin)
{
ResizeDir = Right;
TempCursor.setShape(Qt::SizeHorCursor);
}
else
{
ResizeDir = Nodir;
TempCursor.setShape(Qt::ArrowCursor);
}
setCursor(TempCursor);
}