2011-09-23 4 views

답변

13

당신은 당신이 new를 사용하여 만든 다른 포인터에서와 같은

delete layout; 

를 사용합니다.

12

Chris Wilson의 답변은 정확하지만 레이아웃 아래의 하위 레이아웃과 qwidgets는 삭제되지 않습니다. 복잡한 레이아웃이 있거나 메모리 누수가있는 경우 수동으로 수행하는 것이 가장 좋습니다.

QLayout * layout = new QWhateverLayout(); 

// ... create complicated layout ... 

// completely delete layout and sublayouts 
QLayoutItem * item; 
QLayout * sublayout; 
QWidget * widget; 
while ((item = layout->takeAt(0))) { 
    if ((sublayout = item->layout()) != 0) {/* do the same for sublayout*/} 
    else if ((widget = item->widget()) != 0) {widget->hide(); delete widget;} 
    else {delete item;} 
} 

// then finally 
delete layout; 
+0

생성자에서 부모를 전달할 경우 하위 및 하위 레이아웃이 삭제되므로 올바르지 않습니다. – Goombert

3

현재 레이아웃을 제거하고 새 레이아웃으로 바꾸고 모든 위젯을 레이아웃으로 관리하고 싶습니다. 이 경우에 Chris Wilson의 솔루션이 제대로 작동하지 않는다는 것을 알았습니다. 레이아웃이 항상 변경되는 것은 아닙니다.

void RemoveLayout (QWidget* widget) 
{ 
    QLayout* layout = widget->layout(); 
    if (layout != 0) 
    { 
    QLayoutItem *item; 
    while ((item = layout->takeAt(0)) != 0) 
     layout->removeItem (item); 
    delete layout; 
    } 
} 
+0

항목을 삭제해야합니다. 레이아웃 -> removeItem (항목); 또는 프로그램에서 메모리 누수가 발생합니다. perden 응답을 확인하십시오. – Borzh

0

나는이 질문은 오래 알고 대답 :하지만

은 나를 위해 일한 QtAlgorithms이 qDelteAll을 제공하기 때문에, 하나의 모든 아이들의 삭제를 포함하여, 레이아웃을 삭제할 수 있습니다 -정기선. https://stackoverflow.com/a/35751235/3292513

이 코드는 레이아웃, 모든 어린이와 모든 레이아웃이 '사라'의 내부를 삭제합니다

내가 여기에 게시 된 텍스트의 repuplication입니다.

는 범위 [시작 단부 상기 C를 사용하여 모든 항목을 삭제 (ForwardIterator, ForwardIterator 단부 시작)

공극 qDeleteAll ++ : 여기

qDeleteAll(yourWidget->children()); 

는 오버 기능의 설명이다 delete> 연산자를 사용하십시오. 항목 유형은 포인터 유형이어야합니다 (예 : QWidget *).

qDeleteAll에는 레이아웃이 아닌 위젯의 컨테이너가 제공되어야합니다. qDeleteAll은 yourWidget을 삭제하지 않습니다.

이제 새로운 레이아웃을 설정할 수 있습니다.

관련 문제