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 6.9k 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
    #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