2014-04-07 9 views
1

내부에 항목이있는 레이아웃 목록이 있습니다. 사용자 정의 테이블을 형성합니다.Qt 레이아웃 청소 및 다른 위젯 추가가 작동하지 않습니다. 고스트 위젯이 그대로 있습니다. Qt 버그?

테이블을 청소하려면 모든 레이아웃을 반복하고 항목을 하나씩 꺼내십시오. 그런 다음 레이아웃을 삭제하십시오.

// Delete all items 
    QHBoxLayout* row = NULL; 
    while(!rowLyts_.isEmpty() && (row = rowLyts_.takeAt(0)) != 0) 
    { 
    QLayoutItem *item; 
    while ((item = row->takeAt(0)) != 0) 
     delete item; 
    delete row; 
    } 

이것은 작동하는 것 같습니다. 그러나 내가 테이블을 다시 채우기 시작할 때 나는 청소하기 전에 그곳에 있었던 아이템의 "유령"을 본다. 대부분의 경우 그들은 새로운 객체 뒤에 라인 사이에 있습니다. 그리고 그들은 여전히 ​​일합니다.

위젯이있는 레이아웃 만 사용하는 경우에도 마찬가지입니다.

콘텐츠 위젯을 삭제하지 않고 레이아웃의 전체 레이아웃을 정리하기 만하면됩니다. 레이아웃을 정리하는 안전한 방법!

+0

: 레이아웃을 삭제

QHBoxLayout* row; while(!rowLyts_.isEmpty() && (row = rowLyts_.takeAt(0))) { QLayoutItem *item; while ((item = row->takeAt(0))) { // The item will be deleted when the layout itself is // destructed. Items such as spacers will return a null // widget, its deletion is a safe no-op. delete item->widget(); // We don't handle recursion into sublayouts. // We check for it so that we won't leak the layout. Q_ASSERT(!item->layout()); } delete row; } 
OnWhenReady

답변

4

레이아웃 항목은 삭제하지만 항목을 관리하는 데 사용 된 위젯은 삭제하지 않습니다. 위젯을 삭제해야합니다. 레이아웃 자체를 삭제하면 레이아웃 이외의 모든 항목이 자동으로 삭제됩니다. 난 당신이 위젯을 삭제하지 생각

QLayoutItem* item; 
while ((item = row->takeAt(0)) != NULL) 
{ 
    delete item->widget(); 
    delete item; 
} 
+0

안녕하세요 !! 멋진 대답, 감사합니다!. 나는 두 번째 괄호가 부족하다고 생각합니다. BTW, Q_ASSERTS를 사용한 적이 없습니다 ...이 특정 답변에서 무엇을합니까? – darkgaze

+1

@darkgaze 어설 션은 코드가 작동하는 레이아웃이 묵시적 [전제 조건] (http://en.wikipedia.org/wiki/Precondition)과 일치하는지 확인하기위한 것입니다. 하위 레이아웃이 없어야합니다. 코드 서면으로 작성된대로 그들을 recurse되지 않습니다. 위젯이있는 모든 하위 레이아웃이 누출됩니다 (메모리 누출이 아니라 누출). 어설 션은 전제 조건을 위반하는 경우 실행을 중단합니다. –

+0

오! 그 때 매우 유용합니다. 나는 그들을 사용하는 데 익숙하지 않다. 나는 경건하다. : – darkgaze

2

을 수행 할 수 있습니다 (당신이 위젯을 삽입?). item-> widget()을 호출하여 삭제하십시오.
+0

기본 레이아웃을 삭제하면 항목이 삭제되므로 항목을 삭제할 필요가 없습니다. –

+0

하지만 몇 가지 목적으로 첫 번째 레이아웃을 남기고 싶다면 나중에해야합니까? – darkgaze

+0

필요가 없습니다. 위의 코드를 사용하면 레이아웃을 지우고 새 항목을 삽입 할 수 있습니다. – Nejat