Pregunta Eliminar todos los hijos de QVBoxLayout


tengo un QVBoxLayout dentro de una scrollArea. Agrego dinamicamente QFormLayouts.

widgetTreeStruct* tree = new widgetTreeStruct(QString::number(numberOfGraphs)); 
QFormLayout* layout = tree->getTree(); // get QFormLayout
ui->verticalLayout_2->addLayout(layout); //add to the vertical layout

En un punto, necesito eliminar todo el QFormLayouts desde el QVBoxLayout.

He intentado varias maneras de hacer esto.

  1. Usando qDeleteAll ()

qDeleteAll(ui->verticalLayout_2->children());

Elemento 2.delete uno por uno

QLayoutItem* child;
          while((child = ui->verticalLayout_2->takeAt(0)) != 0)
          {
              if(child->widget() != 0)
              {
                  delete child->widget();
              }

              delete child;
          }

Pero nada pasó. Lo único es que cuando intento agregar elementos a QVBoxLayout, se agregan nuevos elementos sobre los elementos agregados anteriormente.

After added items to QVBoxLayout

Tengo la sensación de que tengo que volver a dibujar, volver a pintar, actualizar, actualizar o algo. Lo intenté ui->verticalLayout_2->update(); pero no funcionó para mí.

¿Entonces qué debo hacer?


5
2017-09-21 15:29


origen


Respuestas:


Borré recursivamente a todos los niños y funcionó para mí.

Este es mi código

void Widget::remove(QLayout* layout)
{
    QLayoutItem* child;
    while(layout->count()!=0)
    {
        child = layout->takeAt(0);
        if(child->layout() != 0)
        {
            remove(child->layout());
        }
        else if(child->widget() != 0)
        {
            delete child->widget();
        }

        delete child;
    }
}

remove(ui->verticalLayout_2);

7
2017-10-06 17:42



Probablemente el padre de los widgets es el que contiene widget, no su diseño (lo que se pasa a sus constructores para el parent ¿parámetro?).

Tal vez QObject::dumpObjectTree() puede ayudarlo a comprender las relaciones entre padres e hijos.

¿Qué sucede con su enfoque 2 (que no depende de que los widgets sean niños en el QObject-el sentido del diseño) es que elimina todos los elementos del diseño con el takeAt() método pero no elimina ninguno de ellos: los hijos de su nivel QVBoxLayout son el QFormLayouts, así que llamando widget() en su QLayoutItems devoluciones 0. Solo usa delete child incondicionalmente para eliminar al niño QLayouts. Sin embargo, esto aún no elimina al niño widgets. Podría llamar recursivamente takeAt() en los diseños secundarios o elimine todos los elementos secundarios del widget principal (su QScrollArea) o mantenga una lista de widgets y / o diseños usted mismo.


1
2017-09-21 15:42