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?

How to add QGridLayout to QScrollArea?

Scheduled Pinned Locked Moved Solved General and Desktop
19 Posts 5 Posters 7.4k 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.
  • T Offline
    T Offline
    TomNow99
    wrote on last edited by TomNow99
    #1

    Hi,

    I have QGridLayout with 10 QLabels. After 5 seconds I will add to QGridLayout next QLabel, so after 5 minutes I will have many QLabels in QGridLayout. Each QLabel has FixedSize. I know that is impossible to have them in the screen at the same moment, so I would like to have Scroll Bar. I know that is QScrollArea class. I try something like that:

    centralWidget()->setLayout(layout);
    layout->addWidget(scrollArea);
    scrollArea->setLayout(layoutWithQLabels);
    

    But I don't get scroll bar and QLabels are overlap.

    I would like something like that:

    from.png

    JonBJ 1 Reply Last reply
    0
    • T TomNow99

      Hi,

      I have QGridLayout with 10 QLabels. After 5 seconds I will add to QGridLayout next QLabel, so after 5 minutes I will have many QLabels in QGridLayout. Each QLabel has FixedSize. I know that is impossible to have them in the screen at the same moment, so I would like to have Scroll Bar. I know that is QScrollArea class. I try something like that:

      centralWidget()->setLayout(layout);
      layout->addWidget(scrollArea);
      scrollArea->setLayout(layoutWithQLabels);
      

      But I don't get scroll bar and QLabels are overlap.

      I would like something like that:

      from.png

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

      @TomNow99

      QWidget *scrollWidget = new QWidget;
      scrollArea->setWidget(scrollWidget);
      scrollWidget->setLayout(layoutWithQLabels);
      
      1 Reply Last reply
      0
      • mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by
        #3

        Hi
        Would it not be easier just to use QListWidget?
        Its a list of text lines that can scroll already.

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

          @mrjj I need QGridLayout

          @JonB Thank you, but what with scrollArea?
          Now I have:

              scrollWidget = new QWidget;
              area->setWidget(scrollWidget);
              scrollWidget->setLayout(layoutWithLabels);
          
              layout->addWidget(area);
              centralWidget()->setLayout(layout);
          

          And I don't see any QLabels.

          EDIT
          I try setCentralWidget(area); but this doesn't work too...

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

            Hi,

            Don't set a layout on a QScrollArea. Set it on the widget contained in the scroll area.

            Then set the scroll area as central widget.

            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
              #6

              @SGaist Hi,
              My code:

                  layoutWithLabels = new QGridLayout;
                  scrollWidget = new QWidget;
                  area= new QScrollArea;
                  area->setWidget(scrollWidget);
                  scrollWidget->setLayout(layoutWithLabels);
                  setCentralWidget(area);
              

              and I add Widgets to layoutWithLabels. But I doesn't see any QLabels.

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

                Well, the code you show here does not contain the part related to the labels. The issue might be in what you did not post.

                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
                • T Offline
                  T Offline
                  TomNow99
                  wrote on last edited by
                  #8

                  @SGaist This is my whole code:

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

                  wektor is QVector<QLabel*>

                  1 Reply Last reply
                  0
                  • 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