Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Resize a Boarderless QMainWindow
Forum Updated to NodeBB v4.3 + New Features

Resize a Boarderless QMainWindow

Scheduled Pinned Locked Moved General and Desktop
10 Posts 2 Posters 4.0k Views 1 Watching
  • 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.
  • J Offline
    J Offline
    joshua-anderson
    wrote on last edited by
    #1

    Hello everyone, I'm trying to resize and move a boarderless qmainwindow. I have used qt am stuck on this. If someone can walk me though this it would be great. I currenly have it moveing but not resizing.

    Here is my code:

    @void mainTrackbox::mousePressEvent(QMouseEvent *event){
    offset = event->pos();
    }

    void mainTrackbox::mouseMoveEvent(QMouseEvent *event)
    {
    if (event->buttons() && Qt::LeftButton) {

        QPoint diff = event->pos() - offset;
        QPoint newpos = this->pos() + diff;
        this->move(newpos);
    

    }

    }

    void mainTrackbox::mouseReleaseEvent(QMouseEvent *event) {
    offset = QPoint();
    }@

    1 Reply Last reply
    0
    • J Offline
      J Offline
      joshua-anderson
      wrote on last edited by
      #2

      I made some progress, I now have it resizing, but it resize the opposite of how it should on the left and top but fine of the right and bottom.

      Here is my code:

      @void mainTrackbox::mousePressEvent(QMouseEvent *event){
      offset = event->pos();
      }

      void mainTrackbox::mouseMoveEvent(QMouseEvent *event)
      {
      qDebug() << offset.x() << "," << offset.y();
      if (event->buttons() && Qt::LeftButton) {

          if(offset.x() <= resizeBorder && offset.y() <= resizeBorder) {
              setCursor(Qt::SizeFDiagCursor);
              resizeMode = true;
          }
          else if(offset.x() >= size().width() - resizeBorder && offset.y() <= resizeBorder) {
              setCursor(Qt::SizeBDiagCursor);
              resizeMode = true;
          }
          else if(offset.x() <= resizeBorder && offset.y() >= size().height() - resizeBorder) {
              setCursor(Qt::SizeBDiagCursor);
              resizeMode = true;
          }
          else if(offset.x() >= size().width() - resizeBorder && offset.y() >= size().height() - resizeBorder) {
              setCursor(Qt::SizeFDiagCursor);
              resizeMode = true;
          }
          else if(offset.x() <= resizeBorder) {
              setCursor(Qt::SizeHorCursor);
              resizeMode = true;
          }
          else if(offset.y() <= resizeBorder) {
              setCursor(Qt::SizeVerCursor);
              resizeMode = true;
          }
          else if(offset.x() >= size().width() - resizeBorder) {
              setCursor(Qt::SizeHorCursor);
              resizeMode = true;
          }
          else if(offset.y() >= size().height() - resizeBorder) {
              setCursor(Qt::SizeVerCursor);
              resizeMode = true;
          }
      
          QPoint diff = event->pos() - offset;
          QPoint newpos = this->pos() + diff;
          if(!resizeMode) {
              this->move(newpos);
          }
      }
      

      }

      void mainTrackbox::mouseReleaseEvent(QMouseEvent *event) {
      setCursor(Qt::ArrowCursor);
      QPoint diff = event->pos() - offset;
      QPoint newpos = this->pos() + diff;
      if(resizeMode) {
      this->resize(newpos.x(), newpos.y());
      resizeMode = false;
      }
      offset = QPoint();
      }@

      1 Reply Last reply
      0
      • francescmmF Offline
        francescmmF Offline
        francescmm
        wrote on last edited by
        #3

        I'm currently working on a window that makes exactly the behavior that you are looking for. Here I post some code that I use. I hope it would be useful!

        I specify 5 pixels to act to resize the window.

        @
        #define PIXELS_TO_ACT 5

        void MainWindow::mouseMoveEvent(QMouseEvent *e)
        {
        int xMouse = e->pos().x();
        int yMouse = e->pos().y();
        int wWidth = geometry().width();
        int wHeight = geometry().height();

        if (moveWidget)
        {
            inResizeZone = false;
            moveWindow(e);
        }
        else if (allowToResize)
            resizeWindow(e);
        //Right side cursor
        else if (xMouse >= wWidth - PIXELS_TO_ACT or allowToResize)
        {
            inResizeZone = true;
        
            if (yMouse >= wHeight - PIXELS_TO_ACT)
                setCursor(Qt::SizeFDiagCursor);
            else if (yMouse <= PIXELS_TO_ACT)
                setCursor(Qt::SizeBDiagCursor);
            else
                setCursor(Qt::SizeHorCursor);
        
            resizeWindow(e);
        }
        //Left side cursor
        else if (xMouse <= PIXELS_TO_ACT or allowToResize)
        {
            inResizeZone = true;
        
            if (yMouse >= wHeight - PIXELS_TO_ACT)
                setCursor(Qt::SizeBDiagCursor);
            else if (yMouse <= PIXELS_TO_ACT)
                setCursor(Qt::SizeFDiagCursor);
            else
                setCursor(Qt::SizeHorCursor);
        
            resizeWindow(e);
        }
        //Bottom side cursor
        else if ((yMouse >= wHeight - PIXELS_TO_ACT) or allowToResize)
        {
            inResizeZone = true;
            setCursor(Qt::SizeVerCursor);
        
            resizeWindow(e);
        }
        //Top side cursor
        else if (yMouse <= PIXELS_TO_ACT or allowToResize)
        {
            inResizeZone = true;
            setCursor(Qt::SizeVerCursor);
        
            resizeWindow(e);
        }
        else
        {
            inResizeZone = false;
            setCursor(Qt::ArrowCursor);
        }
        
        e->accept();
        

        }
        @

        1 Reply Last reply
        0
        • francescmmF Offline
          francescmmF Offline
          francescmm
          wrote on last edited by
          #4

          Second part!
          @void MainWindow::mousePressEvent(QMouseEvent *e)
          {
          if (e->button() == Qt::LeftButton)
          {
          if (inResizeZone)
          {
          allowToResize = true;

                  if (e->pos().y() <= PIXELS_TO_ACT)
                  {
                      if (e->pos().x() <= PIXELS_TO_ACT)
                          resizeDiagTopLeft = true;
                      else if (e->pos().x() >= geometry().width() - PIXELS_TO_ACT)
                          resizeDiagTopRight = true;
                      else
                          resizeVerTop = true;
                  }
                  else if (e->pos().x() <= PIXELS_TO_ACT)
                      resizeHorLeft = true;
              }
              else if (e->pos().x() >= PIXELS_TO_ACT and e->pos().x() < ui->titleBar->geometry().width()
                       and e->pos().y() >= PIXELS_TO_ACT and e->pos().y() < ui->titleBar->geometry().height())
              {
                  moveWidget = true;
                  dragPosition = e->globalPos() - frameGeometry().topLeft();
              }
          }
          e->accept();
          

          }

          void MainWindow::mouseReleaseEvent(QMouseEvent *e)
          {
          moveWidget = false;
          allowToResize = false;
          resizeVerSup = false;
          resizeHorEsq = false;
          resizeDiagSupEsq = false;
          resizeDiagSupDer = false;

          e->accept();
          

          }

          void MainWindow::moveWindow(QMouseEvent *e)
          {
          if (e->buttons() & Qt::LeftButton)
          {
          move(e->globalPos() - dragPosition);
          e->accept();
          }
          }

          void MainWindow::resizeWindow(QMouseEvent *e)
          {
          if (allowToResize)
          {
          int xMouse = e->pos().x();
          int yMouse = e->pos().y();
          int wWidth = geometry().width();
          int wHeight = geometry().height();

              if (cursor().shape() == Qt::SizeVerCursor)
              {
                  if (resizeVerTop)
                  {
                      int newY = geometry().y() + yMouse;
                      int newHeight = wHeight - yMouse;
          
                      if (newHeight > minimumSizeHint().height())
                      {
                          resize(wWidth, newHeight);
                          move(geometry().x(), newY);
                      }
                  }
                  else
                      resize(wWidth, yMouse+1);
              }
              else if (cursor().shape() == Qt::SizeHorCursor)
              {
                  if (resizeHorLeft)
                  {
                      int newX = geometry().x() + xMouse;
                      int newWidth = wWidth - xMouse;
          
                      if (newWidth > minimumSizeHint().width())
                      {
                          resize(newWidth, wHeight);
                          move(newX, geometry().y());
                      }
                  }
                  else
                      resize(xMouse, wHeight);
              }
              else if (cursor().shape() == Qt::SizeBDiagCursor)
              {
                  int newX = 0;
                  int newWidth = 0;
                  int newY = 0;
                  int newHeight = 0;
          
                  if (resizeDiagTopRight)
                  {
                      newX = geometry().x();
                      newWidth = xMouse;
                      newY = geometry().y() + yMouse;
                      newHeight = wHeight - yMouse;
                  }
                  else
                  {
                      newX = geometry().x() + xMouse;
                      newWidth = wWidth - xMouse;
                      newY = geometry().y();
                      newHeight = yMouse;
                  }
          
                  if (newWidth >= minimumSizeHint().width() and newHeight >= minimumSizeHint().height())
                  {
                      resize(newWidth, newHeight);
                      move(newX, newY);
                  }
                  else if (newWidth >= minimumSizeHint().width())
                  {
                      resize(newWidth, wHeight);
                      move(newX, geometry().y());
                  }
                  else if (newHeight >= minimumSizeHint().height())
                  {
                      resize(wWidth, newHeight);
                      move(geometry().x(), newY);
                  }
              }
              else if (cursor().shape() == Qt::SizeFDiagCursor)
              {
                  if (resizeDiagTopLeft)
                  {
                      int newX = geometry().x() + xMouse;
                      int newWidth = wWidth - xMouse;
                      int newY = geometry().y() + yMouse;
                      int newHeight = wHeight - yMouse;
          
                      if (newWidth >= minimumSizeHint().width() and newHeight >= minimumSizeHint().height())
                      {
                          resize(newWidth, newHeight);
                          move(newX, newY);
                      }
                      else if (newWidth >= minimumSizeHint().width())
                      {
                          resize(newWidth, wHeight);
                          move(newX, geometry().y());
                      }
                      else if (newHeight >= minimumSizeHint().height())
                      {
                          resize(wWidth, newHeight);
                          move(geometry().x(), newY);
                      }
                  }
                  else
                      resize(xMouse+1, yMouse+1);
              }
          
              e->accept();
          }
          

          }@

          1 Reply Last reply
          0
          • J Offline
            J Offline
            joshua-anderson
            wrote on last edited by
            #5

            Hello,
            Thanks for all of the help, but I am having one problem.
            No matter what i do, allowToResize is never getting set to true. If I try and remove requirement for allow to allowToResize in resizeWindow(), then it never stops resize and goes back to move mode. Do you know if there is anything I can do?

            1 Reply Last reply
            0
            • J Offline
              J Offline
              joshua-anderson
              wrote on last edited by
              #6

              Also, are the cursors supposed change when you move your mouse over the window? For me they only change when you click.

              1 Reply Last reply
              0
              • francescmmF Offline
                francescmmF Offline
                francescmm
                wrote on last edited by
                #7

                allowToResize must be set to true in mousePressEvent

                Have you call @setMouseTracking(true);@ in the constructor?

                1 Reply Last reply
                0
                • J Offline
                  J Offline
                  joshua-anderson
                  wrote on last edited by
                  #8

                  Thanks for all of the help.

                  Mouse Tracking is set to true, but since it wasn't polling mouse move event correctly, I created a event filter that does. Now it is almost all functional.

                  The window moves normally (though I had to replace the ui bar that you used with arbitrary numbers).

                  However, resizeing is broken. If I move on the top right, top left, bottom left, left, and top, the window goes crazy, resizes in absurd dimensions faster than then the eye can really see and crashes with a bunch of warnings which I think say the window is trying to resize over my set maximum size.

                  Here are the error messages:

                  QXcbShmImage: shmget() failed (22) for size 37353680 (733x12740)
                  QXcbShmImage: shmget() failed (22) for size 41024544 (733x13992)
                  QXcbShmImage: shmget() failed (22) for size 44695408 (733x15244)
                  The program has unexpectedly finished.

                  I am using ubuntu 13.04 and qt 5, if it makes any difference.

                  1 Reply Last reply
                  0
                  • J Offline
                    J Offline
                    joshua-anderson
                    wrote on last edited by
                    #9

                    Here is my code (The only differences from your code being the event filter and the ui bar size using arbitrary numbers)

                    @#include "mainTrackbox.h"
                    #include "ui_mainTrackbox.h"
                    #include <QStyle>
                    #include <QIcon>
                    #include <QMessageBox>
                    #include <QDesktopWidget>
                    #include <QMouseEvent>

                    int const mainTrackbox::resizeBorder = 20;
                    #define PIXELS_TO_ACT 5

                    mainTrackbox::mainTrackbox(QWidget *parent) :
                    QMainWindow(parent),
                    ui(new Ui::mainTrackbox)
                    {
                    ui->setupUi(this);
                    style = qApp->style();
                    qApp->installEventFilter(this);
                    setMouseTracking(true);
                    resizeMode = false;
                    moveWidget =false;
                    inResizeZone = false;
                    allowToResize = false;
                    resizeDiagTopLeft = false;
                    resizeDiagTopRight = false;
                    resizeVerTop = false;
                    resizeHorLeft = false;
                    resizeHorEsq = false;
                    resizeVerSup =false;
                    resizeDiagSupDer = false;
                    resizeDiagSupEsq =false;
                    }

                    mainTrackbox::~mainTrackbox()
                    {
                    delete ui;
                    }

                    void mainTrackbox::mouseMoveEvent(QMouseEvent *e)
                    {
                    int xMouse = e->pos().x();
                    int yMouse = e->pos().y();
                    int wWidth = geometry().width();
                    int wHeight = geometry().height();

                    if (moveWidget)
                    {
                        inResizeZone = false;
                        moveWindow(e);
                    }
                    else if (allowToResize)
                        resizeWindow(e);
                    //Right side cursor
                    else if (xMouse >= wWidth - PIXELS_TO_ACT or allowToResize)
                    {
                        inResizeZone = true;
                    
                        if (yMouse >= wHeight - PIXELS_TO_ACT)
                            setCursor(Qt::SizeFDiagCursor);
                        else if (yMouse <= PIXELS_TO_ACT)
                            setCursor(Qt::SizeBDiagCursor);
                        else
                            setCursor(Qt::SizeHorCursor);
                    
                        resizeWindow(e);
                    }
                    //Left side cursor
                    else if (xMouse <= PIXELS_TO_ACT or allowToResize)
                    {
                        inResizeZone = true;
                    
                        if (yMouse >= wHeight - PIXELS_TO_ACT)
                            setCursor(Qt::SizeBDiagCursor);
                        else if (yMouse <= PIXELS_TO_ACT)
                            setCursor(Qt::SizeFDiagCursor);
                        else
                            setCursor(Qt::SizeHorCursor);
                    
                        resizeWindow(e);
                    }
                    //Bottom side cursor
                    else if ((yMouse >= wHeight - PIXELS_TO_ACT) or allowToResize)
                    {
                        inResizeZone = true;
                        setCursor(Qt::SizeVerCursor);
                    
                        resizeWindow(e);
                    }
                    //Top side cursor
                    else if (yMouse <= PIXELS_TO_ACT or allowToResize)
                    {
                        inResizeZone = true;
                        setCursor(Qt::SizeVerCursor);
                    
                        resizeWindow(e);
                    }
                    else
                    {
                        inResizeZone = false;
                        setCursor(Qt::ArrowCursor);
                    }
                    
                    e->accept();
                    

                    }

                    void mainTrackbox::mousePressEvent(QMouseEvent *e)
                    {
                    if (e->button() == Qt::LeftButton)
                    {
                    if (inResizeZone)
                    {
                    allowToResize = true;

                            if (e->pos().y() <= PIXELS_TO_ACT)
                            {
                                if (e->pos().x() <= PIXELS_TO_ACT)
                                    resizeDiagTopLeft = true;
                                else if (e->pos().x() >= geometry().width() - PIXELS_TO_ACT)
                                    resizeDiagTopRight = true;
                                else
                                    resizeVerTop = true;
                            }
                            else if (e->pos().x() <= PIXELS_TO_ACT)
                                resizeHorLeft = true;
                        }
                        else if (e->pos().x() >= PIXELS_TO_ACT and e->pos().x() < 50
                                 and e->pos().y() >= PIXELS_TO_ACT and e->pos().y() < 20)
                        {
                            moveWidget = true;
                            dragPosition = e->globalPos() - frameGeometry().topLeft();
                        }
                    }
                    e->accept();
                    

                    }@

                    1 Reply Last reply
                    0
                    • J Offline
                      J Offline
                      joshua-anderson
                      wrote on last edited by
                      #10

                      @void mainTrackbox::mouseReleaseEvent(QMouseEvent *e)
                      {
                      moveWidget = false;
                      allowToResize = false;
                      resizeVerSup = false;
                      resizeHorEsq = false;
                      resizeDiagSupEsq = false;
                      resizeDiagSupDer = false;

                      e->accept();
                      

                      }

                      void mainTrackbox::moveWindow(QMouseEvent *e)
                      {
                      if (e->buttons() & Qt::LeftButton)
                      {
                      move(e->globalPos() - dragPosition);
                      e->accept();
                      }
                      }

                      void mainTrackbox::resizeWindow(QMouseEvent *e)
                      {
                      if (allowToResize)
                      {
                      int xMouse = e->pos().x();
                      int yMouse = e->pos().y();
                      int wWidth = geometry().width();
                      int wHeight = geometry().height();

                          if (cursor().shape() == Qt::SizeVerCursor)
                          {
                              if (resizeVerTop)
                              {
                                  int newY = geometry().y() + yMouse;
                                  int newHeight = wHeight - yMouse;
                      
                                  if (newHeight > minimumSizeHint().height())
                                  {
                                      resize(wWidth, newHeight);
                                      move(geometry().x(), newY);
                                  }
                              }
                              else
                                  resize(wWidth, yMouse+1);
                          }
                          else if (cursor().shape() == Qt::SizeHorCursor)
                          {
                              if (resizeHorLeft)
                              {
                                  int newX = geometry().x() + xMouse;
                                  int newWidth = wWidth - xMouse;
                      
                                  if (newWidth > minimumSizeHint().width())
                                  {
                                      resize(newWidth, wHeight);
                                      move(newX, geometry().y());
                                  }
                              }
                              else
                                  resize(xMouse, wHeight);
                          }
                          else if (cursor().shape() == Qt::SizeBDiagCursor)
                          {
                              int newX = 0;
                              int newWidth = 0;
                              int newY = 0;
                              int newHeight = 0;
                      
                              if (resizeDiagTopRight)
                              {
                                  newX = geometry().x();
                                  newWidth = xMouse;
                                  newY = geometry().y() + yMouse;
                                  newHeight = wHeight - yMouse;
                              }
                              else
                              {
                                  newX = geometry().x() + xMouse;
                                  newWidth = wWidth - xMouse;
                                  newY = geometry().y();
                                  newHeight = yMouse;
                              }
                      
                              if (newWidth >= minimumSizeHint().width() and newHeight >= minimumSizeHint().height())
                              {
                                  resize(newWidth, newHeight);
                                  move(newX, newY);
                              }
                              else if (newWidth >= minimumSizeHint().width())
                              {
                                  resize(newWidth, wHeight);
                                  move(newX, geometry().y());
                              }
                              else if (newHeight >= minimumSizeHint().height())
                              {
                                  resize(wWidth, newHeight);
                                  move(geometry().x(), newY);
                              }
                          }
                          else if (cursor().shape() == Qt::SizeFDiagCursor)
                          {
                              if (resizeDiagTopLeft)
                              {
                                  int newX = geometry().x() + xMouse;
                                  int newWidth = wWidth - xMouse;
                                  int newY = geometry().y() + yMouse;
                                  int newHeight = wHeight - yMouse;
                      
                                  if (newWidth >= minimumSizeHint().width() and newHeight >= minimumSizeHint().height())
                                  {
                                      resize(newWidth, newHeight);
                                      move(newX, newY);
                                  }
                                  else if (newWidth >= minimumSizeHint().width())
                                  {
                                      resize(newWidth, wHeight);
                                      move(newX, geometry().y());
                                  }
                                  else if (newHeight >= minimumSizeHint().height())
                                  {
                                      resize(wWidth, newHeight);
                                      move(geometry().x(), newY);
                                  }
                              }
                              else
                                  resize(xMouse+1, yMouse+1);
                          }
                      
                          e->accept();
                      }
                      

                      }

                      bool mainTrackbox::eventFilter(QObject *obj, QEvent *event)
                      {
                      if (event->type() == QEvent::MouseMove)
                      {
                      QMouseEvent mouseEvent = static_cast<QMouseEvent>(event);
                      mouseMoveEvent(mouseEvent);
                      }
                      return false;
                      }@

                      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