2012-07-18 88 views
1

我在按鈕上設置了一個佈局(包含QLabels和QSpacers),我想用新佈局替換它。要做到這一點我做了下面的代碼:在按鈕上設置新佈局

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

這之後我設置了新的佈局:

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

不幸的是,新的佈局設置,但老人們可以依稀可見。我該如何解決這個問題?

回答

2

根據您的意見,您要刪除小工具中的項目,而不是佈局。 QLayout::takeAt返回QLayoutItem*。因此,您正在循環小部件的佈局並刪除佈局項目,但不會添加到佈局項目中的小部件。作爲一個測試,你可以嘗試以下代替:

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

但是,這不是我認爲一個好的長期設計。可能會有一些特殊情況,這是最好的方法,但我建議您考慮使用堆疊的小部件或類似的東西來在呈現的小部件之間來回切換,而不是銷燬並重新創建按鈕中的整個小部件數組。或者,考慮兩個不同的按鈕,並銷燬並重新插入按鈕而不是按鈕的內容。

+0

它通過替換按鈕來工作。謝謝! – Frank 2012-07-19 07:22:31

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 2012-07-18 10:15:23

+0

看到我對此編輯 – 2012-07-18 10:48:37

+0

仍然沒有成功。它確實顯示了新的佈局,但舊的小部件仍然可以在新佈局的「下面」看到。就好像刪除佈局小部件是不夠的......也許我不應該使用刪除,而是使用不同的命令? – Frank 2012-07-18 11:40:29