從 http://doc.qt.io/qt-5.9/qwidget.html#setLayout必須先刪除現有的佈局管理器(由 佈局()返回)後,才能調用的setLayout()的新佈局。如何刪除小部件上已有的佈局?
哪個函數
用於刪除以前的佈局?
從 http://doc.qt.io/qt-5.9/qwidget.html#setLayout必須先刪除現有的佈局管理器(由 佈局()返回)後,才能調用的setLayout()的新佈局。如何刪除小部件上已有的佈局?
哪個函數
用於刪除以前的佈局?
你只需要使用
delete layout;
就像你使用你使用new
創建的任何其他指針。
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;
}
}
您應該刪除項目; layout-> removeItem(item);或者你的程序中會有內存泄漏。退房perden答案。 – Borzh
我知道這個問題是老回答,但是:由於QtAlgorithms提供qDelteAll,可以刪除佈局,包括刪除其所有的孩子有一個-襯墊。
這是我在這裏貼文的repuplication:https://stackoverflow.com/a/35751235/3292513
此代碼刪除佈局,所有的兒童和裏面的一切佈局「消失」。
qDeleteAll(yourWidget->children());
這裏是重載函數的描述:
空隙qDeleteAll(ForwardIterator開始,ForwardIterator端)
刪除在使用C範圍[開始,結束]中的所有項目++刪除>運營商。項目類型必須是指針類型(例如,QWidget *)。
請注意,qDeleteAll需要使用該小部件的容器(不是該佈局)。並注意,qDeleteAll不會刪除yourWidget
- 只是它的孩子。
現在可以設置新的佈局。
我認爲這是不正確的,因爲如果您在構造函數中傳遞父項,它將刪除子項和子項目。 – Goombert