5

scrollArea内にQVBoxLayoutあります。QFormLayoutを動的に追加します。

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

ある時点で、追加されたすべての QFormLayouts を QVBoxLayout から削除する必要あります。

これを行うためにいくつかの方法を試しました。

  1. qDeleteAll() の使用

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

2.アイテムを1つずつ削除する

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

              delete child;
          }

しかし、何も起こりませんでした。QVBoxLayout にアイテムを再度追加しようとすると、以前に追加されたアイテムの上に新しいアイテムが追加されます。

QVBoxLayout に項目を追加した後

再描画、再描画、更新、更新などを行う必要があると感じています。試してみui->verticalLayout_2->update();ましたが、うまくいきませんでした。

それで、私は何をすべきですか?

4

2 に答える 2

8

すべての子を再帰的に削除しましたが、うまくいきました。

これは私のコードです。

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);
于 2013-10-06T17:42:34.320 に答える
2

おそらくウィジェットの親は、それらのレイアウトではなく、含まれているウィジェットparentです (パラメーターのコンストラクターに渡されるものは何ですか?)。

QObject::dumpObjectTree()親子関係を理解するのに役立つかもしれません。

アプローチ2(レイアウトの意味でウィジェットが子であることに依存しない)で何が起こるかはQObject、メソッドを使用してレイアウトからすべてのアイテムを削除しますがtakeAt()、それらのどれも削除しないということです:あなたのトップレベルの子QVBoxLayoutはので、彼らのリターンQFormLayoutを呼び出します。無条件に使用して、子を削除します。ただし、これでも子ウィジェットは削除されません。子レイアウトを再帰的に呼び出すか、親ウィジェット (自分の) のすべての子を削除するか、ウィジェットやレイアウトのリストを自分で保持することができます。widget()QLayoutItems0delete childQLayouttakeAt()QScrollArea

于 2013-09-21T15:42:17.483 に答える