196_QT_无边框窗口的拖动、缩放【拖动实现了,但是不知道为什么无法缩放,大概可能是父窗口this的问题】

65 篇文章 6 订阅

在这里插入图片描述

    QPoint dragPosition;   //鼠标拖动的位置
    int    edgeMargin;     //鼠标检测的边缘距离
    enum {nodir,
          top = 0x01,
          bottom = 0x02,
          left = 0x04,
          right = 0x08,
          topLeft = 0x01 | 0x04,
          topRight = 0x01 | 0x08,
          bottomLeft = 0x02 | 0x04,
          bottomRight = 0x02 | 0x08} resizeDir; //更改尺寸的方向

    void testEdge();  //检测鼠标是否接近窗口边缘

protected:
    void mousePressEvent(QMouseEvent*event);//鼠标按下事件
    void mouseMoveEvent(QMouseEvent*event);//鼠标移动事件
    void mouseReleaseEvent(QMouseEvent*event);//鼠标离开事件

/*
 * 12.05
 * 针对鼠标移动、按下、释放
 * 扩大、缩小窗口
*/
    edgeMargin = 5;         //设置检测边缘为4
    resizeDir = nodir;      //初始化检测方向为无
    setWindowFlags(Qt::FramelessWindowHint);
    setMouseTracking(true); //开启鼠标追踪
    setMinimumSize(600,510);//设置窗体长、宽



/*
 *  12.04
 *  设置关于窗体为圆角
 *  无框架窗口提示
 *  setWindowFlags:这样过后,我们就不能拖动窗口改变位置,以及拖动边缘改变窗口大小了
 *  this为需要设置圆角的窗口指针
 *  drawRoundedRect:画圆角
 *  ( ,15, 15)为设置圆角大小或范围
*/

    QBitmap bmp(this->size());
    bmp.fill();
    QPainter p(&bmp);
    p.setPen(Qt::NoPen);
    p.setBrush(Qt::black);
    p.drawRoundedRect(bmp.rect(), 15, 15);
    setMask(bmp);


void MainWindow::mousePressEvent(QMouseEvent *event)
{
    qDebug() << "mousePressEvent" <<endl;

    /*
     * 事件触发点相对于桌面的位置;
     * 若鼠标在程序窗口中点击,则通过event->globalPos()获取鼠标在桌面坐标系统的位置
     * 当执行event->ignore()时,意味着这次的事件“我”不要接受他,函数执行完把event给我的父窗口,他会需要的。
    */

    event->ignore();
    if (event->button() == Qt::LeftButton)  //每当按下鼠标左键就记录一下位置
     {
       dragPosition = event->globalPos() - frameGeometry().topLeft();  //获得鼠标按键位置相对窗口左上面的位置

    }
}

void MainWindow::testEdge()
{
     qDebug() << "testEdge" <<endl;
     int diffLeft = abs(cursor().pos().x() - frameGeometry().left());       //计算鼠标距离窗口上下左右有多少距离
     int diffRight = abs(cursor().pos().x() - frameGeometry().right());
     int diffTop = abs(cursor().pos().y() - frameGeometry().top());
     int diffBottom = abs(cursor().pos().y() - frameGeometry().bottom());
     qDebug()<< "左:" << diffLeft << "右:" << diffRight << "上:"<< diffTop << "下:"<< diffBottom;


     QCursor tempCursor;                                                    //获得当前鼠标样式,注意:只能获得当前鼠标样式然后再重新设置鼠标样式
     tempCursor = cursor();                                                 //因为获得的不是鼠标指针,所以不能这样用:cursor().setXXXXX

     if(diffTop < edgeMargin){                                              //根据 边缘距离 分类改变尺寸的方向
         if(diffLeft < edgeMargin){
             resizeDir = topLeft;
             tempCursor.setShape(Qt::SizeFDiagCursor);
         }
         else if(diffRight < edgeMargin){
             resizeDir = topRight;
             tempCursor.setShape(Qt::SizeBDiagCursor);
         }
         else{
             resizeDir = top;
             tempCursor.setShape(Qt::SizeVerCursor);
         }
     }
     else if(diffBottom < edgeMargin){
         if(diffLeft < edgeMargin){
             resizeDir = bottomLeft;
             tempCursor.setShape(Qt::SizeBDiagCursor);
         }
         else if(diffRight < edgeMargin){
             resizeDir = bottomRight;
             tempCursor.setShape(Qt::SizeFDiagCursor);
         }
         else{
             resizeDir = bottom;
             tempCursor.setShape(Qt::SizeVerCursor);
         }
     }
     else if(diffLeft < edgeMargin){
         resizeDir = left;
         tempCursor.setShape(Qt::SizeHorCursor);
     }
     else if(diffRight < edgeMargin){
         resizeDir = right;
         tempCursor.setShape(Qt::SizeHorCursor);
     }
     else{
         resizeDir = nodir;
         tempCursor.setShape(Qt::ArrowCursor);
     }

     setCursor(tempCursor);                    //重新设置鼠标,主要是改样式


}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    qDebug() << "mouseMoveEvent" <<endl;

    event->ignore();
    if (event->buttons() & Qt::LeftButton)
    {                 //如果左键是按下的
      if(resizeDir == nodir){                             //如果鼠标不是放在边缘那么说明这是在拖动窗口
         move(event->globalPos() - dragPosition);
      }
      else{
          int ptop,pbottom,pleft,pright;                   //窗口上下左右的值
          ptop = frameGeometry().top();
          pbottom = frameGeometry().bottom();
          pleft = frameGeometry().left();
          pright = frameGeometry().right();
          if(resizeDir & top){                               //检测更改尺寸方向中包含的上下左右分量
              if(height() == minimumHeight()){
                  ptop = min(event->globalY(),ptop);
              }
              else if(height() == maximumHeight()){
                  ptop = max(event->globalY(),ptop);
              }
              else{
                  ptop = event->globalY();
              }
          }
          else if(resizeDir & bottom){
              if(height() == minimumHeight()){
                  pbottom = max(event->globalY(),ptop);
              }
              else if(height() == maximumHeight()){
                  pbottom = min(event->globalY(),ptop);
              }
              else{
                  pbottom = event->globalY();
              }
          }

          if(resizeDir & left){                        //检测左右分量
              if(width() == minimumWidth()){
                  pleft = min(event->globalX(),pleft);
              }
              else if(width() == maximumWidth()){
                  pleft = max(event->globalX(),pleft);
              }
              else{
                  pleft = event->globalX();
              }
          }
          else if(resizeDir & right){
              if(width() == minimumWidth()){
                  pright = max(event->globalX(),pright);
              }
              else if(width() == maximumWidth()){
                  pright = min(event->globalX(),pright);
              }
              else{
                  pright = event->globalX();
              }
          }
          //从屏幕上(pleft,ptop)位置开始(即为最左上角的点),显示一个[pright*pbottom]的界面(宽--pright,高--pbottom)
          setGeometry(QRect(QPoint(pleft,ptop),QPoint(pright,pbottom)));
      }
  }
  else
  {
    testEdge();   //当不拖动窗口、不改变窗口大小尺寸的时候  检测鼠标边缘

  }
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    qDebug() << "mouseReleaseEvent" <<endl;

    event->ignore();
     if(resizeDir != nodir){         //还原鼠标样式
         testEdge();
     }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值