Qt无边框界面的移动与缩放

1.去掉窗体边框   setWindowFlags(Qt::FramelessWindowHint);

2.实现窗体的移动

(1)添加鼠标按压,鼠标释放事件和鼠标移动事件

void mousePressEvent(QMouseEvent * event);  

void mouseReleaseEvent(QMouseEvent * event);

void mouseMoveEvent(QMouseEvent * event);

(2)当鼠标左键按压时,记录鼠标位置,并设置一个标记变量,表示窗口可以移动 ,当鼠标释放是将这个标记变量置为假


void FramelessDialog::mousePressEvent( QMouseEvent * event )
{
 
 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());

具体见下面代码
#ifndef FRAMELESSDIALOG_H
#define FRAMELESSDIALOG_H
#include<QDialog>
#include <QMouseEvent>

#define borderLimit 3
class FramelessDialog : public QDialog
{
 Q_OBJECT
public:
 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:
 enum StretchMode
 {
  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);
 }
}
void FramelessDialog::mouseReleaseEvent( QMouseEvent * event )
{
 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 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);
}
void FramelessDialog::setMoveArea( QPoint Area )
{
 m_AreaLimits = Area;
}
QPoint FramelessDialog::getMoveArea()
{
 return m_AreaLimits;
}
void FramelessDialog::setStretchMode( QMouseEvent * event)
{
 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;
 }
}
void FramelessDialog::setCursorShape( QMouseEvent * event )
{
 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);
 }
}
void FramelessDialog::CursorStretchActive( QMouseEvent * event )
{
 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;
 }
}



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值