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. Dynamically add buttons to ScrollArea
Forum Updated to NodeBB v4.3 + New Features

Dynamically add buttons to ScrollArea

Scheduled Pinned Locked Moved Solved General and Desktop
13 Posts 4 Posters 8.7k 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.
  • A Offline
    A Offline
    andrewhopps
    wrote on last edited by andrewhopps
    #1

    alt text

    So I've tried a fair amount of times to get this so when I pressed the + button(and after filling some information out, that it would add another button similar to the first, but any attempts I've seen and even copy pasted into mine have not done anything or caused things to just crash unexpectedly.

    How is this supposed to be done if these are just standard pushbuttons?

    (also tried to just move an existing button into the scrollarea with no success.)

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

      Hi,

      As a quick idea from your description:

      • a container widget that you put in the QScrollArea,
      • a QHBoxLayout on that widget.
      • Add your new buttons to that horizontal layout.

      What did you try ?

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

      A 1 Reply Last reply
      1
      • SGaistS SGaist

        Hi,

        As a quick idea from your description:

        • a container widget that you put in the QScrollArea,
        • a QHBoxLayout on that widget.
        • Add your new buttons to that horizontal layout.

        What did you try ?

        A Offline
        A Offline
        andrewhopps
        wrote on last edited by andrewhopps
        #3

        @SGaist I'm pretty much lost completely as to what I'm supposed to be doing. As of right now the setup is:

        • frame
          • scrollArea
            • scrollAreaContents
              • horizontalLayout
                • pushButton (x5)

        I don't know what parts I need to be writing code for. I had things scrolling fine at some point last night but kept messing with different code trying to get it all working and nothing works, so back to 0 code in source.

        1 Reply Last reply
        0
        • A Offline
          A Offline
          andrewhopps
          wrote on last edited by andrewhopps
          #4
          This post is deleted!
          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #5

            Like I wrote, create a container widget to put in the QScrollArea using QScrollArea::setWidget.

            Don't set any layout on QScrollArea, it's just wrong.

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

            A 1 Reply Last reply
            0
            • SGaistS SGaist

              Like I wrote, create a container widget to put in the QScrollArea using QScrollArea::setWidget.

              Don't set any layout on QScrollArea, it's just wrong.

              A Offline
              A Offline
              andrewhopps
              wrote on last edited by andrewhopps
              #6

              @SGaist And is setting a layout on the container widget what I'm supposed to be doing I would assume as it now operates how I imagined? So if the container is a frame, how am I adding new buttons to that in a specific place?

              For example: I want to add the button to be the 3rd widget out of the 5 or so.

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

                You can use insertWidget.

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

                A 1 Reply Last reply
                0
                • SGaistS SGaist

                  You can use insertWidget.

                  A Offline
                  A Offline
                  andrewhopps
                  wrote on last edited by andrewhopps
                  #8

                  @SGaist Okay, I'm missing something here. The only way I'm getting things to just display properly is with simple

                      ui->scrollArea_2->setWidget(ui->frame_2);
                  

                  Something keeps confusing me and just sends me further back into not understanding what is going on. I have my layout, and I set the layout on my container, then I added my widgets, followed by setting my scrollarea to display my container widget and the program crashes upon start. With segmentation fault at the first use of hlayout.

                      QHBoxLayout *hlayout;
                      ui->scrollArea_2->setWidgetResizable(true);
                      ui->frame_2->setLayout(hlayout);
                      hlayout->addWidget(ui->pushButton_14);
                      hlayout->addWidget(ui->pushButton_16);
                      hlayout->addWidget(ui->pushButton_17);
                      hlayout->addWidget(ui->pushButton_18);
                      hlayout->addWidget(ui->pushButton_19);
                      ui->scrollArea_2->setWidget(ui->frame_2);
                  
                  1 Reply Last reply
                  0
                  • hskoglundH Offline
                    hskoglundH Offline
                    hskoglund
                    wrote on last edited by
                    #9

                    Hi, instead of
                    QHBoxLayout *hlayout;
                    try
                    QHBoxLayout *hlayout = new QHBoxLayout;

                    A 1 Reply Last reply
                    1
                    • hskoglundH hskoglund

                      Hi, instead of
                      QHBoxLayout *hlayout;
                      try
                      QHBoxLayout *hlayout = new QHBoxLayout;

                      A Offline
                      A Offline
                      andrewhopps
                      wrote on last edited by andrewhopps
                      #10

                      @hskoglund said in Dynamically add buttons to ScrollArea:

                      QHBoxLayout *hlayout = new QHBoxLayout;

                      Edited:

                      That stopped the crashing and the order of code was off, and after rearranging to the following, everything works as originally intended. Much thanks to you both.

                          QHBoxLayout *hlayout = new QHBoxLayout;
                          ui->scrollArea_2->setWidget(ui->frame_2);
                          ui->frame_2->setLayout(hlayout);
                          ui->scrollArea_2->setWidgetResizable(true);
                          hlayout->addWidget(ui->pushButton_14);
                          hlayout->addWidget(ui->pushButton_16);
                          hlayout->addWidget(ui->pushButton_18);
                          hlayout->addWidget(ui->pushButton_19);
                          hlayout->insertWidget(0, ui->pushButton_7);
                      
                      1 Reply Last reply
                      0
                      • A Offline
                        A Offline
                        andrewhopps
                        wrote on last edited by
                        #11

                        Well to expand on the previous issue, I've been able to create my buttons and such, but have no way of accessing their clicked functions. Been looking around and saw a few people saying QSignalMapper, so gave that a few tries and nothing functional. Multiple no such signals when the function I was trying to connect most definitely existed and contained just a qDebug saying it worked. I have my container populated with database items, and no clue where to be placing what within or outside of this function.

                                qry->prepare("SELECT type || ' ' || number FROM Car WHERE rowid >= 2");
                                if(qry->exec())
                                {
                                    while(qry->next())
                                    {
                                    QString cName;
                                    cName = qry->value(0).toString();
                                    QPushButton *newCar = new QPushButton(cName);
                                    newCar->setStyleSheet("background-color: rgb(240, 240, 240);"
                                                          "background-image: url(:/Resources/Images/Resources/Images/carButton.png);"
                                                          "background-repeat: no-repeat;"
                                                          "background-attachment: fixed;"
                                                          "background-position: center;");
                                    newCar->setFixedSize(213, 108); 
                                    newCar->setIconSize(QSize(200,100)); 
                                    hlayout->addWidget(newCar); 
                                    }
                                }
                        
                        J.HilkJ 1 Reply Last reply
                        0
                        • A andrewhopps

                          Well to expand on the previous issue, I've been able to create my buttons and such, but have no way of accessing their clicked functions. Been looking around and saw a few people saying QSignalMapper, so gave that a few tries and nothing functional. Multiple no such signals when the function I was trying to connect most definitely existed and contained just a qDebug saying it worked. I have my container populated with database items, and no clue where to be placing what within or outside of this function.

                                  qry->prepare("SELECT type || ' ' || number FROM Car WHERE rowid >= 2");
                                  if(qry->exec())
                                  {
                                      while(qry->next())
                                      {
                                      QString cName;
                                      cName = qry->value(0).toString();
                                      QPushButton *newCar = new QPushButton(cName);
                                      newCar->setStyleSheet("background-color: rgb(240, 240, 240);"
                                                            "background-image: url(:/Resources/Images/Resources/Images/carButton.png);"
                                                            "background-repeat: no-repeat;"
                                                            "background-attachment: fixed;"
                                                            "background-position: center;");
                                      newCar->setFixedSize(213, 108); 
                                      newCar->setIconSize(QSize(200,100)); 
                                      hlayout->addWidget(newCar); 
                                      }
                                  }
                          
                          J.HilkJ Offline
                          J.HilkJ Offline
                          J.Hilk
                          Moderators
                          wrote on last edited by J.Hilk
                          #12

                          @andrewhopps
                          hi,

                          I would suggest using lambdas in your case, should makes things a bit easier

                          ...
                          int index = 0;
                          while(qry->next())
                          {
                                      .....
                                      QPushButton *newCar = new QPushButton(cName);
                                      ....
                                     connect(newCar, &QPushButton::clicked, newCar, [=]{newCarClicked(index});
                                     index++;
                          }
                          

                          in your class you add now the function newCarClicked and handle the actions

                          void newCarClicked(int index{
                            switch(index){
                             case 0: break;
                             ....
                             default:break;
                            }
                          }
                          

                          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                          Q: What's that?
                          A: It's blue light.
                          Q: What does it do?
                          A: It turns blue.

                          A 1 Reply Last reply
                          2
                          • J.HilkJ J.Hilk

                            @andrewhopps
                            hi,

                            I would suggest using lambdas in your case, should makes things a bit easier

                            ...
                            int index = 0;
                            while(qry->next())
                            {
                                        .....
                                        QPushButton *newCar = new QPushButton(cName);
                                        ....
                                       connect(newCar, &QPushButton::clicked, newCar, [=]{newCarClicked(index});
                                       index++;
                            }
                            

                            in your class you add now the function newCarClicked and handle the actions

                            void newCarClicked(int index{
                              switch(index){
                               case 0: break;
                               ....
                               default:break;
                              }
                            }
                            
                            A Offline
                            A Offline
                            andrewhopps
                            wrote on last edited by
                            #13

                            @J.Hilk Absolutely perfect! Much cleaner code than what I was attempting and trying to copy from. Thank you very much.

                            1 Reply Last reply
                            0

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved