2012-07-18 5 views
1

버튼에 QLabels 및 QSpacers가 포함 된 레이아웃이 있고이 레이아웃을 새 것으로 바꾸려고합니다. 이를 위해 나는 다음과 같은 코드를 만든이 후버튼에 새 레이아웃 설정

while(!layout.isEmpty()) 
{ 
    delete(layout.takeAt(0)); 
} 

을 나는 새 레이아웃 설정 : 불행하게도 새로운 레이아웃이 설정되어

layout.addWidget(...) 
layout.addSpacer(...) 
... 
button.setLayout(layout) 

을하지만, 이전은 여전히 ​​볼 수 있습니다. 어떻게 해결할 수 있습니까?

답변

2

귀하의 의견에 따라 레이아웃이 아닌 위젯의 항목을 삭제하고 싶습니다. QLayout::takeAtQLayoutItem*을 반환합니다. 따라서 위젯의 레이아웃을 반복하고 레이아웃 항목을 삭제하지만 레이아웃 항목에 추가 된 위젯은 삭제하지 않습니다. 테스트로 다음을 시도해보십시오.

while(!layout.isEmpty()) 
{ 
    delete layout.itemAt(0)->widget(); 
    delete layout.takeAt(0); 
} 

그러나 이것은 좋은 장기적인 디자인이라고 생각하지 않습니다. 이 방법이 가장 좋은 몇 가지 특수한 경우가있을 수 있지만 스택 위젯이나 유사한 위젯을 앞뒤로 전환하여 버튼의 전체 위젯 배열을 파괴하고 다시 만드는 대신 유사한 위젯을 사용하는 것이 좋습니다. . 또는 두 개의 서로 다른 버튼을 고려하고 버튼의 내용보다는 버튼을 제거한 다음 다시 삽입하십시오.

+0

버튼을 교체하여 작동했습니다. 고맙습니다! – Frank

0

당신은 새로운 레이아웃을 설정하기 전에

delete button.layout(); 

일을 시도 할 수 있습니다.

또는 기존 레이아웃에 위젯 등을 추가 할 수 있습니다. 그런 다음 새 레이아웃을 설정하지 않아도됩니다.

만큼 당신은 기존의 레이아웃에 대한 포인터를 사용할 때 [편집] 이 작동합니다 : 이것은 단지 업데이트 문제가있는 경우

QLayout* layout = button.layout(); 
while(!layout->isEmpty()) 
{ 
    delete(layout->takeAt(0)); 
} 

layout->addWidget(...) 
layout->addSpacer(...) 
// do not call button.setLayout() 

[Edit2가] 시도 할 수

button->update(); 
QApplication::processEvents(QEventLoop::IgnoreUserInputEvents); 
+0

고마워,하지만 전체 레이아웃을 삭제하고 싶지 않아. 나는 그것을 비우고 거기에 새로운 위젯/스페이서를 넣고 싶다. 그래서 버튼에 같은 ​​레이아웃을 유지하고 싶습니다. – Frank

+0

내 편집을 참조하십시오. –

+0

아직 성공하지 못했습니다. 새로운 레이아웃을 보여 주지만 이전 위젯은 여전히 ​​새로운 레이아웃의 "밑에"보일 수 있습니다. 레이아웃 위젯을 삭제하는 것만으로는 충분하지 않은 것 같습니다 ... 삭제를 사용해서는 안되지만 다른 명령을 사용 하시겠습니까? – Frank