가 먼저 기존의 레이아웃 매니저 삭제해야합니다 ( 레이아웃에 의해 반환을()) 새 레이아웃 setLayout의()를 호출하기 전에.위젯에서 이미 존재하는 레이아웃을 삭제하는 방법은 무엇입니까?
은 이전 레이아웃을 삭제하는 데 사용됩니다?
가 먼저 기존의 레이아웃 매니저 삭제해야합니다 ( 레이아웃에 의해 반환을()) 새 레이아웃 setLayout의()를 호출하기 전에.위젯에서 이미 존재하는 레이아웃을 삭제하는 방법은 무엇입니까?
은 이전 레이아웃을 삭제하는 데 사용됩니다?
당신은 당신이 new
를 사용하여 만든 다른 포인터에서와 같은
delete layout;
를 사용합니다.
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;
현재 레이아웃을 제거하고 새 레이아웃으로 바꾸고 모든 위젯을 레이아웃으로 관리하고 싶습니다. 이 경우에 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;
}
}
항목을 삭제해야합니다. 레이아웃 -> removeItem (항목); 또는 프로그램에서 메모리 누수가 발생합니다. perden 응답을 확인하십시오. – Borzh
나는이 질문은 오래 알고 대답 :하지만
이
은 나를 위해 일한 QtAlgorithms이 qDelteAll을 제공하기 때문에, 하나의 모든 아이들의 삭제를 포함하여, 레이아웃을 삭제할 수 있습니다 -정기선. https://stackoverflow.com/a/35751235/3292513이 코드는 레이아웃, 모든 어린이와 모든 레이아웃이 '사라'의 내부를 삭제합니다
이
내가 여기에 게시 된 텍스트의 repuplication입니다. 는 범위 [시작 단부 상기 C를 사용하여 모든 항목을 삭제 (ForwardIterator, ForwardIterator 단부 시작)공극 qDeleteAll ++ : 여기
는 오버 기능의 설명이다 delete> 연산자를 사용하십시오. 항목 유형은 포인터 유형이어야합니다 (예 : QWidget *).qDeleteAll(yourWidget->children());
qDeleteAll에는 레이아웃이 아닌 위젯의 컨테이너가 제공되어야합니다. qDeleteAll은 yourWidget
을 삭제하지 않습니다.
이제 새로운 레이아웃을 설정할 수 있습니다.
생성자에서 부모를 전달할 경우 하위 및 하위 레이아웃이 삭제되므로 올바르지 않습니다. – Goombert