2016-06-14 6 views
0

私はどこでも検索し、これを解決するものは何も見つかりませんでした。私はQVBoxLayoutを作成し、データのWeb呼び出しを行います。データが戻ってきたとき、私は、これは素晴らしい作品最初の4つについては、このQVBoxLayoutQT 5.6 QVBoxLayout removeWidget、次にaddWidgetが期待通りに動作しない

verticalLayout->addWidget(nsd); 

に4つのカスタムウィジェットを追加します。すべてが必要に応じて表示されます。しかし、私は4つのウィジェットのいずれかを削除し、そのウィジェットを下部に追加したいと考えています。削除は、私はその後、長い私の画面に描画していないウィジェットそのため、それが正常に動作します知っている

verticalLayout->removeWidget(nsd); 
delete nsd; 

正常に動作します。問題は、ウィジェットの追加が完全には機能していないことです。私は同じコードを呼び出します

をチェックし、verticalLayout-> count()が4つの項目を示していることを確認します。ウィジェットは、前に追加されたウィジェットと同じ親ウィジェットで作成されます。新しいウィジェットのペイントイベントは呼び出されません。さらに、画面に表示される3つの項目は3つの項目に分かれています。どこにでも穴があるようなものではない。私はまた削除を追加しようとしましたが、それは同じ問題です。新しいアイテムは描画されず、そのサイズは決して組み込まれません。

+1

削除されたウィジェットを追加していますか? –

答えて

2

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

以下は、追加/削除されるウィジェットの種類が何であっても安全です。削除に呼び出しスタックのターゲットウィジェットがある場合は、deleteの代わりにdeleteLaterを使用する必要があります。しかし、これは、ターゲットウィジェットがイベントループに再入力しない限り、関連のないウィジェットからのシグナルに応答して削除することはできません(そうではありません)。

// 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(); 
} 
+0

カスタムウィジェットが何をしているのかわからなくても、 '' deleteLater() ''をより安全にしませんか? – OnWhenReady

+0

@OnWhenReadyこの例の削除は、ターゲットウィジェットから発生したイベントからは行われないため、ターゲットは即座に削除できます。カスタムウィジェットが何をしているかは問題ではありません。イベントループに再入力しない限り(ウィジェットは壊れています) –

+0

これは良い答えです。私の問題は、コードに入れなかったものでした。ウィジェットをベクトルに格納して呼び出しました。 vec.erase(std :: remove(vec.begin()、vec.end()、 nsd)、vec.end()); は、そのリストから新しい項目を削除していましたが、それをメモリ内で破棄していましたか? –

関連する問題