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.0k 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.
  • 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