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. Deleting data from a QScrollArea

Deleting data from a QScrollArea

Scheduled Pinned Locked Moved Solved General and Desktop
qscrollarea
16 Posts 2 Posters 10.6k Views 1 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 mrjj

    @mar0029
    That is super.
    So its the "red" ones you are trying to replace?

    Also, can u just replace Widget holding all the reds,?
    or you do u need to keep some of them?

    M Offline
    M Offline
    mar0029
    wrote on last edited by
    #7

    @mrjj Thank you! I used a ruler and everything!

    I would like to keep everything up to the red a.k.a. my QVBoxLayout
    What happens to all of the QHboxLayout and all the widgets within those Layouts, I don't care.

    1 Reply Last reply
    0
    • mrjjM Offline
      mrjjM Offline
      mrjj
      Lifetime Qt Champion
      wrote on last edited by
      #8

      Hmm.
      Ok. I was kinda planning
      to just create new widget with a boxlayout and call
      setWidget on ScrollArea.
      But u say this crashes?

      M 1 Reply Last reply
      0
      • mrjjM Offline
        mrjjM Offline
        mrjj
        Lifetime Qt Champion
        wrote on last edited by mrjj
        #9

        Hi again
        i made same layout in designer
        I kill them this way

        
        void MainWindow::on_btremove_released() {
        
          QList<QWidget*> allSubLayouts = ui->innerwidget->findChildren<QWidget*>(QString(), Qt::FindDirectChildrenOnly);
          int size = allSubLayouts.size();
          // take all out
          while (( ui->innerwidget->layout()->takeAt(0)) != 0)
            // killem
            for(int i = 0; i < size; i++) {
              qDebug() << allSubLayouts[i]->metaObject()->className();
              delete allSubLayouts[i];
        
            }
        
        
        }
        
        

        U can check your self.
        https://www.dropbox.com/s/auivviiv8tv7jfw/myscroll.zip?dl=0
        should be the same you want if i read ur fine drawing correct :)
        Note the Qt::FindDirectChildrenOnly flag!

        M 1 Reply Last reply
        0
        • mrjjM mrjj

          Hmm.
          Ok. I was kinda planning
          to just create new widget with a boxlayout and call
          setWidget on ScrollArea.
          But u say this crashes?

          M Offline
          M Offline
          mar0029
          wrote on last edited by
          #10

          @mrjj
          I don't want to delete my QWidget because I would have to dynamically create a new one each time I loaded a new file and I really don't want to deal with that.

          I'm making some progress with this:

              while((child = mainVbox->layout()->takeAt(0)) != 0)
                  {
                  delete child;
                  }
          

          but in the documentation it says that when I delete a layout, I have to delete the widgets separately.
          So I'm trying to make a list of the widgets found within the sublayout and then delete from there but it's not working.

          1 Reply Last reply
          0
          • mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by
            #11

            Did u try the sample?
            It leaves the QWidget and layout but kills all it members.

            M 1 Reply Last reply
            0
            • mrjjM mrjj

              Hi again
              i made same layout in designer
              I kill them this way

              
              void MainWindow::on_btremove_released() {
              
                QList<QWidget*> allSubLayouts = ui->innerwidget->findChildren<QWidget*>(QString(), Qt::FindDirectChildrenOnly);
                int size = allSubLayouts.size();
                // take all out
                while (( ui->innerwidget->layout()->takeAt(0)) != 0)
                  // killem
                  for(int i = 0; i < size; i++) {
                    qDebug() << allSubLayouts[i]->metaObject()->className();
                    delete allSubLayouts[i];
              
                  }
              
              
              }
              
              

              U can check your self.
              https://www.dropbox.com/s/auivviiv8tv7jfw/myscroll.zip?dl=0
              should be the same you want if i read ur fine drawing correct :)
              Note the Qt::FindDirectChildrenOnly flag!

              M Offline
              M Offline
              mar0029
              wrote on last edited by
              #12

              @mrjj oh my where did you find that flag? How did you know you could do ui->innerWidget->findChildren<QWidget*>(String(), Qt::FindDirectChildrenOnly); ??

              1 Reply Last reply
              0
              • mrjjM mrjj

                Did u try the sample?
                It leaves the QWidget and layout but kills all it members.

                M Offline
                M Offline
                mar0029
                wrote on last edited by
                #13

                @mrjj Thank you for your help. I am unable to get it to work right now but I can see this achieving the goal. I will come back to it later today/tomorrow.

                Thanks again!

                1 Reply Last reply
                0
                • mrjjM Offline
                  mrjjM Offline
                  mrjj
                  Lifetime Qt Champion
                  wrote on last edited by
                  #14

                  Hi
                  In the documentation for findChildren. I went looking as your
                  drawing made it very clear what u wanted. (kill all inner widgets)

                  So If you do it for your Widget (myWidget), it should do the same.
                  ( i hope :)

                  you are welcome. I hope u get it to work.

                  M 1 Reply Last reply
                  0
                  • mrjjM mrjj

                    Hi
                    In the documentation for findChildren. I went looking as your
                    drawing made it very clear what u wanted. (kill all inner widgets)

                    So If you do it for your Widget (myWidget), it should do the same.
                    ( i hope :)

                    you are welcome. I hope u get it to work.

                    M Offline
                    M Offline
                    mar0029
                    wrote on last edited by
                    #15

                    @mrjj
                    So here is what I've ended up doing.

                    I had been able to get a QList of the layouts in the main layout like so

                     QList<QLayout *> allSubLayouts = mainVbox->findChildren<QLayout *>();
                    

                    So I checked if that list was empty or not, basically seeing if it was the first time to use the program.

                    if(!allSubLayouts.empty())
                    {
                    
                        int size = allSubLayouts.size();
                        for(int i = 0; i < size; i ++)
                        {
                            qDebug() << "this is what is at allSublayouts.at("<<i<<") " << allSubLayouts.at(i);
                    
                    
                            for(int j = 0; j < allSubLayouts.at(i)->count(); ++j)
                            {
                                QWidget *w = allSubLayouts.at(i)->itemAt(j)->widget();
                                if(w != NULL)
                                {
                                    w->setVisible(false);
                                }
                            }
                        }
                    }
                    

                    Since I knew that there were layouts available, instead of using findChildren() I used allSubLayouts.at(i)->*itemAt*(j)->*widget*();

                    While this solves my problem of widgets and layouts overlapping in MainWindow, I don't know if it will cause a memory leak or will use up too much memory, since I'm not deleting any widgets/layouts.

                    1 Reply Last reply
                    0
                    • mrjjM Offline
                      mrjjM Offline
                      mrjj
                      Lifetime Qt Champion
                      wrote on last edited by mrjj
                      #16

                      Hi

                      "allSubLayouts.at(i)->*itemAt*(j)->*widget*();"
                      

                      made my brain hurt :)
                      Well since u are not deleting any widgets, u will use more and more memory,
                      but since they are still owned by layout, it will be free when application ends.

                      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