0

どこでも検索しましたが、これを解決するものは何も見つかりませんでした。QVBoxLayout を作成してから、データの Web 呼び出しを行います。データが戻ってきたら、この QVBoxLayout に 4 つのカスタム ウィジェットを追加します。

verticalLayout->addWidget(nsd);

最初の 4 つの場合、これはうまく機能します。すべてが必要に応じて表示されます。ただし、4 つのウィジェットのいずれかを削除してから、一番下にウィジェットを追加したいと考えています。削除は正常に機能します

 verticalLayout->removeWidget(nsd);
delete nsd;

そのウィジェットが画面に描画されなくなったため、正常に動作することはわかっています。問題は、ウィジェットの追加が完全に機能していないことです。私は同じコードを呼び出します

verticalLayout->addWidget(nsd);

verticalLayout->count() を確認すると、4 つの項目があることがわかります。ウィジェットは、以前に追加されたものと同じ親ウィジェットで作成されます。新しいウィジェットのペイント イベントが呼び出されることはありません。さらに、画面に表示される 3 は、3 つのアイテムの間隔で表示されます。どこにも穴が開いているわけではありません。追加してから削除も試みましたが、同じ問題です。新しいアイテムが描画されることはなく、そのサイズが考慮されることもありません。

4

1 に答える 1

2

ウィジェットを完全に削除したい場合は、破棄するだけです。レイアウトにあった場合は心配する必要はありません。ウィジェットが動的に割り当てられる場合、delete nsd必要なのはそれだけで、layout->removeWidget呼び出しは必要ありません。また、ウィジェットに明示的な親を与える必要はありません。レイアウトに挿入すると、適切な親が設定されます。

以下は、追加/削除されるウィジェットのタイプに関係なく機能し、安全です。削除の対象ウィジェットがコール スタックにある場合はdeleteLater、plain の代わりに使用する必要がありdeleteます。しかし、関係のないウィジェットからのシグナルに応答してそれを削除する場合、ターゲット ウィジェットがイベント ループに再び入る場合を除き、これは決して当てはまりません (ああ、そうすべきではありません)。

// https://github.com/KubaO/stackoverflown/tree/master/questions/layout-addremove-37814292
#include <QtWidgets>

int main(int argc, char ** argv) {
   QApplication app(argc, argv);
   QWidget widget;
   QVBoxLayout layout(&widget);
   QPushButton button;
   QLabel label("Hello");
   layout.addWidget(&button);
   layout.addWidget(&label);

   auto onClick = [&]{
      if (layout.count() == 3) {
         delete layout.itemAt(2)->widget();
         button.setText("Add");
      } else {
         layout.addWidget(new QLabel("Hello too!"));
         button.setText("Remove");
      }
   };
   QObject::connect(&button, &QPushButton::clicked, onClick);
   onClick();

   widget.show();
   return app.exec();
}
于 2016-06-14T14:47:25.907 に答える