Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Chinese
  4. 如何实现缩放窗口,窗口比例不变? 我尝试重写resizeEvent 但是没有任何效果 您知不知道如何实现呢?
Forum Updated to NodeBB v4.3 + New Features

如何实现缩放窗口,窗口比例不变? 我尝试重写resizeEvent 但是没有任何效果 您知不知道如何实现呢?

Scheduled Pinned Locked Moved Unsolved Chinese
5 Posts 3 Posters 1.3k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    asas456
    wrote on last edited by
    #1
    This post is deleted!
    A 1 Reply Last reply
    0
    • JoeCFDJ Offline
      JoeCFDJ Offline
      JoeCFD
      wrote on last edited by
      #2

      implement the following:
      int QWidget::heightForWidth( int w ) { return w; }
      https://doc.qt.io/qt-5/qwidget.html#heightForWidth

      A 1 Reply Last reply
      0
      • A asas456

        This post is deleted!

        A Offline
        A Offline
        asas456
        wrote on last edited by
        #3
        This post is deleted!
        1 Reply Last reply
        0
        • JoeCFDJ JoeCFD

          implement the following:
          int QWidget::heightForWidth( int w ) { return w; }
          https://doc.qt.io/qt-5/qwidget.html#heightForWidth

          A Offline
          A Offline
          asas456
          wrote on last edited by
          #4

          @JoeCFD 无法完全解决我的问题,因为改变高度时,窗口就会变形,无法保持 16:9

          KeepAspectRatio::KeepAspectRatio(QWidget *getWindow)
          {
              getWindow->setMouseTracking(true);
              getWindow->installEventFilter(this);
              this->window = getWindow;
          }
          
          bool KeepAspectRatio::eventFilter(QObject *obj, QEvent *event)
          {
              //qDebug() << obj << this->parent();
              if(this->window == obj)
              {
                  //qDebug() << "in";
                  widget = static_cast<QWidget *>(obj);
                  QMouseEvent *me = static_cast<QMouseEvent *>(event);
                  switch(event->type())
                  {
                      case QEvent::MouseButtonPress:
                      {
                      if(this->moveUnkown == true)
                          {
                          //qDebug() << "this->moveUnkown == true";
                          break;
                          }
                          else if(this->moveLeft == true || this->moveRight == true || this->moveTop == true || this->moveBottom == true)
                          {
                          this->isPressMove = true;
                          //qDebug() << "this->isPressMove = true";
                          }
                      //qDebug() << "this->moveUnkown == false";
                      break;
                      }
          
                      case QEvent::MouseMove:
                      {
                      //qDebug() << me->globalPos().x() << oldGlobalPoint.x();
                      //qDebug() << abs(me->globalPos().x() - oldGlobalPoint.x());
                      if(this->isPressMove == true)
                          {
                          if(this->moveLeft == true)
                              {
                              int changeX = oldGlobalPoint.x() - me->globalPos().x();
                              changeWindow(changeX, 0);
                              }
                          else if(this->moveRight == true)
                              {
                              int changeX = me->globalPos().x() - oldGlobalPoint.x() - oldSize.width();
                              changeWindow(changeX, 0);
                              }
                          else if(this->moveBottom == true)
                              {
                              int changeY = me->globalPos().y() - oldGlobalPoint.y() - oldSize.height() - (widget->frameGeometry().height() - widget->height());
                              //qDebug() << me->globalPos().y() << oldGlobalPoint.y() << oldSize.height() << "changeY = " << changeY;
                              changeWindow(0, changeY);
                              }
                          else if(this->moveTop == true)
                              {
                              }
                          }
                      //qDebug() << me->globalPos().x() << oldGlobalPoint.x();
                      //if left right
                      if(abs(me->globalPos().x() - widget->pos().x()) < 5 || abs(widget->pos().x() + widget->frameGeometry().width() - me->globalPos().x()) < 5)
                          {
                          //qDebug() << "set Qt::SizeHorCursor";
                          widget->setCursor(Qt::SizeHorCursor);
          
                          if(abs(me->globalPos().x() - widget->pos().x()) < 5)
                          {
                               //qDebug() << "this->moveLeft = true";
                               this->moveLeft = true;
                               this->moveUnkown = false;
                          }
                          if(abs(widget->pos().x() + widget->frameGeometry().width() - me->globalPos().x()) < 5)
                          {
                               this->moveRight = true;
                               this->moveUnkown = false;
                               //qDebug() << "this->moveRight = true";
                          }
                       }
                      else if(abs(me->globalPos().y() - widget->pos().y() - widget->frameGeometry().height()) < 5 || widget->frameGeometry().height() - widget->height() + NonCliAreaMePoint.y() < 5)
                      {
                          widget->setCursor(Qt::SizeVerCursor);
                          if(abs(me->globalPos().y() - widget->pos().y() - widget->frameGeometry().height()) < 5)
                          {
                          this->moveBottom = true;
                          this->moveUnkown = false;
                          }
                          if(widget->frameGeometry().height() - widget->height() + NonCliAreaMePoint.y() < 5)
                          {
                          this->moveTop = true;
                          this->moveUnkown = false;
                          }
                      }
                      else
                      {
                          widget->setCursor(Qt::ArrowCursor);
                          if(this->isPressMove == false)
                          {
                              this->moveLeft = false;
                              this->moveRight = false;
                              this->moveBottom = false;
                              this->moveUnkown = true;
                          }
                      }
                      break;
                      }
          
                      case QEvent::MouseButtonRelease:
                      {
                      this->isPressMove = false;
                      this->moveLeft = false;
                      this->moveRight = false;
                      this->moveUnkown = true;
                      //////////////
                      oldSize = widget->size();
                      oldGlobalPoint = widget->pos();
                      widget->setFixedSize(widget->size());
                      //qDebug() << oldSize << oldGlobalPoint;
                      /////////////
                      //qDebug() << "MouseButtonRelease";
                      break;
                      }
          
                      case QEvent::Show:
                      {
                      oldSize = widget->size();
                      oldGlobalPoint = widget->pos();
                      widget->setFixedSize(widget->size());
                      //qDebug() << oldGlobalPoint << oldSize;
                      break;
                      }
          
                      case QEvent::NonClientAreaMouseMove:
                      {
                      this->NonCliAreaMePoint = me->pos();
                      //qDebug() << NonCliAreaMePoint.y() << widget->pos().y();
                      //qDebug() << widget->frameGeometry().height() - widget->height() + NonCliAreaMePoint.y();
                      }
          
                      case QEvent::NonClientAreaMouseButtonRelease:
                      {
                      oldGlobalPoint = widget->pos();
                      }
          
                  default:
                      break;
                 }
              }
              return QWidget::eventFilter(obj, event);
          }
          
          void KeepAspectRatio::changeWindow(int changeX, int changeY)
          {
              if(this->moveLeft == true)
                  {
                  newGlobalPoint.setX(oldGlobalPoint.x() - changeX);
                  newGlobalPoint.setY(oldGlobalPoint.y());
                  newSize.setWidth(oldSize.width() + changeX);
                  newSize.setHeight(newSize.width() * 9 / 16);
                  }
              else if(this->moveRight == true)
                  {
                  newGlobalPoint.setX(oldGlobalPoint.x());
                  newGlobalPoint.setY(oldGlobalPoint.y());
                  newSize.setWidth(oldSize.width() + changeX);
                  newSize.setHeight(newSize.width() * 9 / 16);
                  }
              else if(this->moveBottom == true)
              {
                  newGlobalPoint.setX(oldGlobalPoint.x());
                  newGlobalPoint.setY(oldGlobalPoint.y());
                  newSize.setHeight(oldSize.height() + changeY);
                  newSize.setWidth(newSize.height() * 16 / 9);
                   qDebug() << newGlobalPoint << newSize;
              }
              if(newSize.width() < 1280 || newSize.height() < 720)
              {
                  return;
              }
              oldSize = widget->size();
              oldGlobalPoint = widget->pos();
              widget->move(newGlobalPoint);
              widget->setFixedSize(newSize);
          }
          

          这段代码 可以实现左边 右边和下面拖动 保持16:9缩放 但是我想要实现,上方拖动 保持16:9缩放 但是如果鼠标停留在标题栏 无法改变鼠标样式 您知道如何做吗?

          1 Reply Last reply
          0
          • xanaduX Offline
            xanaduX Offline
            xanadu
            wrote on last edited by
            #5

            如果你想要实现相当窗口缩放的功能,你需要在resizeEvent时获取用户按下的位置(上下左右和四个角)然后保持原始比例来同步调整宽和高。这样可以保证用户无论在哪里调整大小,原始比例都不会变。
            同时,你需要按原始与现在的比例调整控件的字号。控件的大小可以按百分比自动调整。

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved