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