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. How to add QGridLayout to QScrollArea?
Forum Updated to NodeBB v4.3 + New Features

How to add QGridLayout to QScrollArea?

Scheduled Pinned Locked Moved Solved General and Desktop
19 Posts 5 Posters 7.3k Views 2 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #9

    Just a silly idea: build the complete widget first so it has all its content in place and as last step create the scroll area and put the widget in.

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    1 Reply Last reply
    0
    • T Offline
      T Offline
      TomNow99
      wrote on last edited by TomNow99
      #10

      @SGaist hmmm, it works, but there is a new problem.

      Now my code looks like:

          layoutWithLabels = new QGridLayout;
      
          for(int i=0;i<30;i++)
          {
              wektor.append(new QLabel(QString::number(i)));
              wektor[i]->setStyleSheet("QLabel {background-color:red}");
      
              layoutWithLabels->addWidget(wektor[i],i,0);
      
              wektor[i]->setFixedSize(50,20);
          }
          scrollWidget = new QWidget;
          scrollWidget->setLayout(layoutWithLabels);
          area= new QScrollArea;
          area->setWidget(scrollWidget);
      
          setCentralWidget(area);
      

      But if you read my first post I would like to add a new QLabel to QGridLayout after 5 sec. I have QTimer and slot:

      void MainWindow::timeoutSlot()
      {
          static int i=30;
          wektor.append(new QLabel(QString::number(i)));
          wektor[i]->setStyleSheet("QLabel {background-color:red}");
      
          layoutWithLabels->addWidget(wektor[i],i,0);
      
          wektor[i]->setFixedSize(50,20);
          i++;
      }
      

      and it add new QLabel, but look:
      This is my app after start:
      good.png

      and this is my app after add new QLabels:
      bad.png

      QLabels are overlap

      JonBJ 1 Reply Last reply
      0
      • SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #11

        There's no need for that static i variable. You can use the vector size for your computation.

        Interested in AI ? www.idiap.ch
        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply
        0
        • T Offline
          T Offline
          TomNow99
          wrote on last edited by
          #12

          @SGaist Yeah, you are right with static :) But what with the main problem?

          1 Reply Last reply
          0
          • T TomNow99

            @SGaist hmmm, it works, but there is a new problem.

            Now my code looks like:

                layoutWithLabels = new QGridLayout;
            
                for(int i=0;i<30;i++)
                {
                    wektor.append(new QLabel(QString::number(i)));
                    wektor[i]->setStyleSheet("QLabel {background-color:red}");
            
                    layoutWithLabels->addWidget(wektor[i],i,0);
            
                    wektor[i]->setFixedSize(50,20);
                }
                scrollWidget = new QWidget;
                scrollWidget->setLayout(layoutWithLabels);
                area= new QScrollArea;
                area->setWidget(scrollWidget);
            
                setCentralWidget(area);
            

            But if you read my first post I would like to add a new QLabel to QGridLayout after 5 sec. I have QTimer and slot:

            void MainWindow::timeoutSlot()
            {
                static int i=30;
                wektor.append(new QLabel(QString::number(i)));
                wektor[i]->setStyleSheet("QLabel {background-color:red}");
            
                layoutWithLabels->addWidget(wektor[i],i,0);
            
                wektor[i]->setFixedSize(50,20);
                i++;
            }
            

            and it add new QLabel, but look:
            This is my app after start:
            good.png

            and this is my app after add new QLabels:
            bad.png

            QLabels are overlap

            JonBJ Offline
            JonBJ Offline
            JonB
            wrote on last edited by JonB
            #13

            @TomNow99
            I think QGridLayout's job is to fit everything. You have to give something a size/spacing to make it work. setRowMinimumHeight(int row, int minSize)? setSpacing(int spacing)?

            1 Reply Last reply
            0
            • T Offline
              T Offline
              TomNow99
              wrote on last edited by
              #14

              @JonB I try setSpacing and setRow but not work :(

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #15

                Since you have your labels in on column, why not use a QVBoxLayout ?

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                1 Reply Last reply
                1
                • mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #16

                  Hi
                  Tried your code and it worked?
                  (not including the static int )

                  alt text

                    QTimer::singleShot(5000, [this, layoutWithLabels]() {
                          wektor.append(new QLabel(QString::number( wektor.size()))  );
                          wektor.last()->setStyleSheet("QLabel {background-color:blue}");
                  
                          layoutWithLabels->addWidget(wektor.last(), wektor.size(), 0);
                  
                          wektor.last()->setFixedSize(50, 20);
                      });
                  
                  1 Reply Last reply
                  1
                  • T Offline
                    T Offline
                    TomNow99
                    wrote on last edited by
                    #17

                    Hello,
                    @SGaist You are right. I started from QVBoxLayout, but I had problem with Alingment QLabels in layout, so I use QGridLayout.

                    @mrjj Please repeat add QLabel many Times. Of course you can change 5 sec to 0.5 sec. When I use your code I get:

                    bad2.png

                    1 Reply Last reply
                    0
                    • B Offline
                      B Offline
                      Bonnie
                      wrote on last edited by Bonnie
                      #18

                      [EDITED]
                      Removed my previous answer.
                      I've found the solution:

                      layoutWithLabels->setSizeConstraint(QLayout::SetMinimumSize);
                      

                      QLayout::SetMinAndMaxSize also works.

                      1 Reply Last reply
                      4
                      • T Offline
                        T Offline
                        TomNow99
                        wrote on last edited by
                        #19

                        @Bonnie P E R F E C T! Thank you!

                        Thanks for all you:@mrjj @JonB @SGaist

                        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