1.去掉窗体边框 setWindowFlags(Qt::FramelessWindowHint);
2.实现窗体的移动
(1)添加鼠标按压,鼠标释放事件和鼠标移动事件
void mousePressEvent(QMouseEvent * event);
void mouseReleaseEvent(QMouseEvent * event);
void mouseMoveEvent(QMouseEvent * event);
(2)当鼠标左键按压时,记录鼠标位置,并设置一个标记变量,表示窗口可以移动 ,当鼠标释放是将这个标记变量置为假
{
if (event->button() == Qt::LeftButton)
{
m_move = true;
}
}
void FramelessDialog::mouseReleaseEvent( QMouseEvent * event )
{
m_mousePos = event->pos();
if (event->button() == Qt::LeftButton)
{
m_move = false;
}
}
(3)通过检测鼠标移动和窗体是否可以移动标志,通过计算来移动窗口
move(event->globalX()-m_mousePos.x(),event->globalY()-m_mousePos.y());
3窗口的缩放
窗体的缩放分为八个方向,上 下 左 右 左上 左下 右上 右下
(1)通过鼠标移动时间检测鼠标是否处于窗体边缘,如果是设置鼠标样式
setCursor(Qt::SizeFDiagCursor);
(2)检测是否需要缩放
如果需要设置窗体大小和位置
m_windowSize.setWidth(m_windowSize.width()-mouseX);
m_windowSize.setHeight(m_windowSize.height()-mouseY);
setGeometry(mouseGX,mouseGY,m_windowSize.width(),m_windowSize.height());
m_windowSize.setHeight(m_windowSize.height()-mouseY);
setGeometry(mouseGX,mouseGY,m_windowSize.width(),m_windowSize.height());
具体见下面代码
#ifndef FRAMELESSDIALOG_H
#define FRAMELESSDIALOG_H
#define FRAMELESSDIALOG_H
#include<QDialog>
#include <QMouseEvent>
#include <QMouseEvent>
#define borderLimit 3
class FramelessDialog : public QDialog
{
Q_OBJECT
{
Q_OBJECT
public:
FramelessDialog(QDialog *parent = 0);
~FramelessDialog();
void mousePressEvent(QMouseEvent * event);
void mouseReleaseEvent(QMouseEvent * event);
void mouseMoveEvent(QMouseEvent * event);
FramelessDialog(QDialog *parent = 0);
~FramelessDialog();
void mousePressEvent(QMouseEvent * event);
void mouseReleaseEvent(QMouseEvent * event);
void mouseMoveEvent(QMouseEvent * event);
void setMoveArea(QPoint Area);
QPoint getMoveArea();
//设置拉伸的状态
void setStretchMode(QMouseEvent * event);
//设置鼠标样式
void setCursorShape(QMouseEvent * event);
//拉伸控制
void CursorStretchActive(QMouseEvent * event);
private:
void setStretchMode(QMouseEvent * event);
//设置鼠标样式
void setCursorShape(QMouseEvent * event);
//拉伸控制
void CursorStretchActive(QMouseEvent * event);
private:
enum StretchMode
{
Top,
Right,
Bottom,
Left,
TopLeft,
TopRight,
BottomRight,
BottomLeft,
No
};
{
Top,
Right,
Bottom,
Left,
TopLeft,
TopRight,
BottomRight,
BottomLeft,
No
};
bool m_move; //判断界面是否应该移动
StretchMode m_stretchMove;//判断是否可以伸缩
QPoint m_mousePos; //记录鼠标点击的位置,防止界面移动时出错
QPoint m_AreaLimits; //确定鼠标点击的区域,如果在该区域中则可以拖动,x为上半部分,y为下半部粉 默认的是上半部分50 下半部分25
QRect m_windowSize; //初始状态下的窗口大小
};
#endif // FRAMELESSDIALOG_H
#include "FramelessDialog.h"
FramelessDialog::FramelessDialog(QDialog *parent)
: QDialog(parent),m_move(false),m_mousePos(0,0),m_stretchMove(No)
{
setWindowFlags(Qt::FramelessWindowHint);
setMouseTracking(true);
m_AreaLimits.setX(50);
m_AreaLimits.setY(size().height()-20);
m_windowSize =frameGeometry();
}
FramelessDialog::~FramelessDialog()
{
{
}
void FramelessDialog::mousePressEvent( QMouseEvent * event )
{
if (event->button() == Qt::LeftButton)
{
if (event->pos().y() <= m_AreaLimits.x() || event->pos().y() >= m_AreaLimits.y())
{
m_move = true;
m_mousePos = event->pos();
}
setStretchMode(event);
}
}
{
if (event->button() == Qt::LeftButton)
{
if (event->pos().y() <= m_AreaLimits.x() || event->pos().y() >= m_AreaLimits.y())
{
m_move = true;
m_mousePos = event->pos();
}
setStretchMode(event);
}
}
void FramelessDialog::mouseReleaseEvent( QMouseEvent * event )
{
m_mousePos = event->pos();
if (event->button() == Qt::LeftButton)
{
m_move = false;
{
m_mousePos = event->pos();
if (event->button() == Qt::LeftButton)
{
m_move = false;
m_stretchMove= No;
}
}
}
}
void FramelessDialog::mouseMoveEvent( QMouseEvent * event )
{
int mouseX = event->pos().x();
int mouseY = event->pos().y();
{
int mouseX = event->pos().x();
int mouseY = event->pos().y();
int mouseGX = event->globalX();
int mouseGY = event->globalY();
//设置移动
if (m_move && cursor().shape() == Qt::ArrowCursor)
{
move(event->globalX()-m_mousePos.x(),event->globalY()-m_mousePos.y());
}
//设置鼠标样式
setCursorShape(event);
CursorStretchActive(event);
int mouseGY = event->globalY();
//设置移动
if (m_move && cursor().shape() == Qt::ArrowCursor)
{
move(event->globalX()-m_mousePos.x(),event->globalY()-m_mousePos.y());
}
//设置鼠标样式
setCursorShape(event);
CursorStretchActive(event);
}
void FramelessDialog::setMoveArea( QPoint Area )
{
m_AreaLimits = Area;
}
{
m_AreaLimits = Area;
}
QPoint FramelessDialog::getMoveArea()
{
return m_AreaLimits;
}
{
return m_AreaLimits;
}
void FramelessDialog::setStretchMode( QMouseEvent * event)
{
int mouseX = event->pos().x();
int mouseY = event->pos().y();
{
int mouseX = event->pos().x();
int mouseY = event->pos().y();
if (mouseX <= borderLimit && mouseY <= borderLimit)
{
m_stretchMove = TopLeft;
}
else if (mouseX >= size().width() - borderLimit && mouseY <= borderLimit )
{
m_stretchMove = TopRight;
}
else if (mouseX <= borderLimit &&mouseY >= size().height() - borderLimit)
{
m_stretchMove = BottomLeft;
}
else if (mouseX >= size().width() - borderLimit && mouseY >= size().height() - borderLimit )
{
m_stretchMove = BottomRight;
}
else if (mouseX <= borderLimit)
{
m_stretchMove = Left;
}
else if (mouseX >= size().width() - borderLimit)
{
m_stretchMove = Right;
}
else if (mouseY <= borderLimit )
{
m_stretchMove = Top;
}
else if (mouseY >= size().height() - borderLimit)
{
m_stretchMove = Bottom;
}
else
{
m_stretchMove = No;
}
{
m_stretchMove = TopLeft;
}
else if (mouseX >= size().width() - borderLimit && mouseY <= borderLimit )
{
m_stretchMove = TopRight;
}
else if (mouseX <= borderLimit &&mouseY >= size().height() - borderLimit)
{
m_stretchMove = BottomLeft;
}
else if (mouseX >= size().width() - borderLimit && mouseY >= size().height() - borderLimit )
{
m_stretchMove = BottomRight;
}
else if (mouseX <= borderLimit)
{
m_stretchMove = Left;
}
else if (mouseX >= size().width() - borderLimit)
{
m_stretchMove = Right;
}
else if (mouseY <= borderLimit )
{
m_stretchMove = Top;
}
else if (mouseY >= size().height() - borderLimit)
{
m_stretchMove = Bottom;
}
else
{
m_stretchMove = No;
}
}
void FramelessDialog::setCursorShape( QMouseEvent * event )
{
int mouseX = event->pos().x();
int mouseY = event->pos().y();
{
int mouseX = event->pos().x();
int mouseY = event->pos().y();
if (mouseX <= borderLimit && mouseY <= borderLimit)
{
setCursor(Qt::SizeFDiagCursor);
}
else if (mouseX >= size().width() - borderLimit && mouseY <= borderLimit )
{
setCursor(Qt::SizeBDiagCursor);
}
else if (mouseX <= borderLimit &&mouseY >= size().height() - borderLimit)
{
setCursor(Qt::SizeBDiagCursor);
}
else if (mouseX >= size().width() - borderLimit && mouseY >= size().height() - borderLimit )
{
setCursor(Qt::SizeFDiagCursor);
}
else if (mouseX <= borderLimit)
{
setCursor(Qt::SizeHorCursor);
}
else if (mouseX >= size().width() - borderLimit)
{
setCursor(Qt::SizeHorCursor);
}
else if (mouseY <= borderLimit )
{
setCursor(Qt::SizeVerCursor);
}
else if (mouseY >= size().height() - borderLimit)
{
setCursor(Qt::SizeVerCursor);
}
else
{
setCursor(Qt::ArrowCursor);
}
}
{
setCursor(Qt::SizeFDiagCursor);
}
else if (mouseX >= size().width() - borderLimit && mouseY <= borderLimit )
{
setCursor(Qt::SizeBDiagCursor);
}
else if (mouseX <= borderLimit &&mouseY >= size().height() - borderLimit)
{
setCursor(Qt::SizeBDiagCursor);
}
else if (mouseX >= size().width() - borderLimit && mouseY >= size().height() - borderLimit )
{
setCursor(Qt::SizeFDiagCursor);
}
else if (mouseX <= borderLimit)
{
setCursor(Qt::SizeHorCursor);
}
else if (mouseX >= size().width() - borderLimit)
{
setCursor(Qt::SizeHorCursor);
}
else if (mouseY <= borderLimit )
{
setCursor(Qt::SizeVerCursor);
}
else if (mouseY >= size().height() - borderLimit)
{
setCursor(Qt::SizeVerCursor);
}
else
{
setCursor(Qt::ArrowCursor);
}
}
void FramelessDialog::CursorStretchActive( QMouseEvent * event )
{
int mouseX = event->pos().x();
int mouseY = event->pos().y();
int mouseGX = event->globalX();
int mouseGY = event->globalY();
{
int mouseX = event->pos().x();
int mouseY = event->pos().y();
int mouseGX = event->globalX();
int mouseGY = event->globalY();
switch (m_stretchMove)
{
case Top:
m_windowSize.setHeight(m_windowSize.height()-mouseY);
setGeometry(mouseGX - mouseX,mouseGY+mouseY,m_windowSize.width(),m_windowSize.height());
break;
case Bottom:
m_windowSize.setHeight(mouseY);
setGeometry(mouseGX - mouseX,mouseGY-mouseY,m_windowSize.width(),m_windowSize.height());
break;
case Left:
m_windowSize.setWidth(m_windowSize.width()-mouseX);
setGeometry(mouseGX ,mouseGY-mouseY,m_windowSize.width(),m_windowSize.height());
break;
case Right:
m_windowSize.setWidth(mouseX);
setGeometry(mouseGX -mouseX,mouseGY-mouseY,m_windowSize.width(),m_windowSize.height());
break;
case TopLeft:
m_windowSize.setWidth(m_windowSize.width()-mouseX);
m_windowSize.setHeight(m_windowSize.height()-mouseY);
setGeometry(mouseGX,mouseGY,m_windowSize.width(),m_windowSize.height());
break;
case TopRight:
m_windowSize.setWidth(mouseX);
m_windowSize.setHeight(m_windowSize.height()-mouseY);
setGeometry(mouseGX-mouseX,mouseGY,m_windowSize.width(),m_windowSize.height());
break;
case BottomLeft:
m_windowSize.setWidth(m_windowSize.width() - mouseX);
m_windowSize.setHeight( mouseY);
setGeometry(mouseGX,mouseGY-mouseY,m_windowSize.width(),m_windowSize.height());
break;
case BottomRight:
m_windowSize.setWidth(mouseX);
m_windowSize.setHeight(mouseY);
setGeometry(mouseGX -mouseX,mouseGY-mouseY,m_windowSize.width(),m_windowSize.height());
break;
default:
break;
}
}
{
case Top:
m_windowSize.setHeight(m_windowSize.height()-mouseY);
setGeometry(mouseGX - mouseX,mouseGY+mouseY,m_windowSize.width(),m_windowSize.height());
break;
case Bottom:
m_windowSize.setHeight(mouseY);
setGeometry(mouseGX - mouseX,mouseGY-mouseY,m_windowSize.width(),m_windowSize.height());
break;
case Left:
m_windowSize.setWidth(m_windowSize.width()-mouseX);
setGeometry(mouseGX ,mouseGY-mouseY,m_windowSize.width(),m_windowSize.height());
break;
case Right:
m_windowSize.setWidth(mouseX);
setGeometry(mouseGX -mouseX,mouseGY-mouseY,m_windowSize.width(),m_windowSize.height());
break;
case TopLeft:
m_windowSize.setWidth(m_windowSize.width()-mouseX);
m_windowSize.setHeight(m_windowSize.height()-mouseY);
setGeometry(mouseGX,mouseGY,m_windowSize.width(),m_windowSize.height());
break;
case TopRight:
m_windowSize.setWidth(mouseX);
m_windowSize.setHeight(m_windowSize.height()-mouseY);
setGeometry(mouseGX-mouseX,mouseGY,m_windowSize.width(),m_windowSize.height());
break;
case BottomLeft:
m_windowSize.setWidth(m_windowSize.width() - mouseX);
m_windowSize.setHeight( mouseY);
setGeometry(mouseGX,mouseGY-mouseY,m_windowSize.width(),m_windowSize.height());
break;
case BottomRight:
m_windowSize.setWidth(mouseX);
m_windowSize.setHeight(mouseY);
setGeometry(mouseGX -mouseX,mouseGY-mouseY,m_windowSize.width(),m_windowSize.height());
break;
default:
break;
}
}