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. Set (individual) size for widgets in gridlayout

Set (individual) size for widgets in gridlayout

Scheduled Pinned Locked Moved Unsolved General and Desktop
layoutqgridlayoutsize
2 Posts 2 Posters 5.2k 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
    Agricola
    wrote on last edited by Agricola
    #1

    I have a QGridLayout with multiple labels I want to show images in. It should look like this: 0_1548411436939_camera_layout.png
    So far I didn't find a convenient way to set the different label sizes. I tried to use the addWidget method and specified the rows and columns the labels should be spanning.

    grid->addWidget(labelLeft, 0, 0, 3, 4);
    grid->addWidget(labelMid, 0, 5, 10, 6);
    grid->addWidget(labelRight, 0, 11, 3, 4);
    grid->addWidget(labelBot, 11, 6, 3, 4);
    

    I thought in this example the vertical screen place would be split in 13 rows with equal height, of which the big label should be using 10 and the bottom one 3. That however is not the case; the big label merely uses a little more than half the vertical space.

    How to proceed here? Can someone point me in the right direction? I don't have to use a gridlayout just thought it was the most intuitive. I want to later use the free space in the bottom corners to display different data.

    P 1 Reply Last reply
    0
    • A Agricola

      I have a QGridLayout with multiple labels I want to show images in. It should look like this: 0_1548411436939_camera_layout.png
      So far I didn't find a convenient way to set the different label sizes. I tried to use the addWidget method and specified the rows and columns the labels should be spanning.

      grid->addWidget(labelLeft, 0, 0, 3, 4);
      grid->addWidget(labelMid, 0, 5, 10, 6);
      grid->addWidget(labelRight, 0, 11, 3, 4);
      grid->addWidget(labelBot, 11, 6, 3, 4);
      

      I thought in this example the vertical screen place would be split in 13 rows with equal height, of which the big label should be using 10 and the bottom one 3. That however is not the case; the big label merely uses a little more than half the vertical space.

      How to proceed here? Can someone point me in the right direction? I don't have to use a gridlayout just thought it was the most intuitive. I want to later use the free space in the bottom corners to display different data.

      P Offline
      P Offline
      pcman11
      wrote on last edited by pcman11
      #2

      @Agricola

      Hi.
      If you look for ideal elements fit, like in form in QTCreator, You don't have to use Layout.
      Just put widgets on place, make it ALL proportional etc.
      include class I put below, I put example too at the end
      It works like a charm, if you will have to use QLayouts, make them MaxMin constraint, but results may be strange. When you use it, better forget about layouts ;)

      #ifndef GEOFIT_H
      #define GEOFIT_H
      #include <QWidget>
      #include <QApplication>
      #include <QWidgetList>
      #include <QScreen>
      #include <QDebug>
      
      class geofit : public QObject
      {
          Q_OBJECT
      public:
          explicit geofit(QObject* parent=0);
          virtual ~geofit();
      
          QString orientation();
          QWidget* widget;
      
          void widgetsResizer(QWidget*);
          bool fixed;
      
          QScreen* primary_screen=QApplication::primaryScreen();
      #if defined(Q_OS_IOS)
          QSize viewport_size=QApplication::primaryScreen()->availableVirtualSize();
      #else
          QSize viewport_size=QApplication::primaryScreen()->availableVirtualSize();
      #endif
          int sW=viewport_size.width();
          int sH=viewport_size.height();
      
      };
      
      #endif // GEOFIT_H
      
      

      SOURCE:

      #include "geofit.h"
      
      geofit::geofit(QObject* parent){
          fixed=true;  // if you want to have MinMax sizes setted
      }
      geofit::~geofit()
      {
      }
      QString geofit::orientation()
      {
          Qt::ScreenOrientation orientation=QApplication::primaryScreen()->orientation();
          switch (orientation) {
          case Qt::PrimaryOrientation           : return "Primary";
          case Qt::LandscapeOrientation         : return "Landscape";
          case Qt::PortraitOrientation          : return "Portrait";
          case Qt::InvertedLandscapeOrientation : return "Inverted landscape";
          case Qt::InvertedPortraitOrientation  : return "Inverted portrait";
          default: return "Unknown";
          }
      }
      
      // INTELLIGENT RESIZE FORM TO FIT WITH KEEPING ASPECT RATIO
      
      void geofit::widgetsResizer(QWidget* w){
          int x,y,xs,ys;
          w->geometry().getCoords(&x,&y,&xs,&ys);
          qDebug()<<viewport_size;
          qreal sFY=qreal(sH) / qreal(ys-y);
          qreal sFX=qreal(sW) / qreal(xs-x);
          QList<QWidget *> widgets = w->findChildren<QWidget *>();
          for(int j = 0; j < widgets.count(); ++j){
              widget=widgets.at(j);
              if(widget!=nullptr){
                  if(widget->objectName()=="centralwidget"){
                      widget->setFixedSize(sW,sH);
                      widget->resize(sW,sH);
                      // qDebug()<<"centr:"<<sW<<sH<<widget->geometry()<<widget->geometry()<<w->sizeHint();
                      // w->adjustSize(); // uncomment if document is partially displayed
                      continue;
                  }
                  // DO NOT CHANGE ANYTHING IN NEXT 4 LINES
                  x=widget->x()*(sFX*10000)/10000;          // left - top corner X
                  y=widget->y()*(sFY*10000)/10000;          // Y
                  xs=widget->width()*(sFX*10000)/10000;     // width
                  ys=widget->height()*(sFY*10000)/10000;
              //    qDebug()<<widget->objectName()<<"!!"<<widget->geometry()<<x<<y<<xs<<ys;// height
                   if(fixed){
                      widget->setFixedSize(xs,ys);
                  } else qInfo()<<widget->objectName()<<" :: NO FIXED POLICY";
                  widget->setGeometry(x,y,xs,ys);
              }
          }
         // qDebug()<<"W1:"<<w->geometry()<<","<<w->sizeHint();
          w->adjustSize();
         // qDebug()<<"W2:"<<w->geometry()<<","<<w->sizeHint();
          fixed=true;
      }
      
      
      EXAMPLE 1:
      ....
       ui->setupUi(this);
          geofit geo;
          geo.widgetsResizer(this);
          showFullScreen();
      ....
      
      you can use it external. too:
      
      geofit geo;
      a=new a(this)
      b=new b(this)
      c=new c(this)
      geo(a);
      geo(b);
      geo(c);
      
      
      

      Good luck :)

      1 Reply Last reply
      1

      • Login

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