2012-04-17 66 views
11

我在看示例here,並想知道是否沒有內存泄漏。我有紅色的文章談論subjet mem leak on delete。然而,雖然QWidgets確實保留了添加到該窗口小部件的所有權,但佈局卻沒有。QBoxLayout的所有者是否成爲所有佈局小部件的所有者?

它從QT碼與佈局的父,得到所有的部件此佈局的所有權看起來。但是我在文檔中沒有看到任何這方面的參考。

Window::Window() 
{ 
editor = new QTextEdit(); 
QPushButton *sendButton = new QPushButton(tr("&Send message")); 

connect(sendButton, SIGNAL(clicked()), this, SLOT(sendMessage())); 

QHBoxLayout *buttonLayout = new QHBoxLayout(); 
buttonLayout->addStretch(); 
buttonLayout->addWidget(sendButton); 
buttonLayout->addStretch(); 

QVBoxLayout *layout = new QVBoxLayout(this); 
layout->addWidget(editor); 
layout->addLayout(buttonLayout); 

setWindowTitle(tr("Custom Type Sending")); 
} 
+0

雖然派生類沒有提到它,但基本佈局類(QLayout)說'addWidget'調用'addItem' ...和'addItem'說:*「**注意:**項目的所有權被轉移到佈局,並且佈局的責任是將其刪除。「* http://doc.qt.nokia.com/4.7-snapshot/qlayout。html#addItem – HostileFork 2012-04-17 17:16:53

+0

@HostileFork將* item *的所有權轉移到佈局。不是小部件本身的所有權。看看我的[答](http://stackoverflow.com/a/38003370/1951907),試圖澄清這一點。 – Boris 2016-06-23 23:19:25

回答

15

Layout Management

提示使用佈局

當您使用的佈局,你並不需要傳遞時 構建子控件父。 佈局將自動 重新設置父級的部件(使用QWidget的::的setParent()),使他們在其上安裝的佈局widget的 孩子。

注:小部件的佈局是在其上安裝的,而不是佈局本身的 佈局小部件的孩子。小部件只能有 其他小部件作爲父項,而不是佈局。

您可以在佈局使用addLayout()巢佈局;內部佈局 然後成爲它插入的佈局的子元素。

+1

沒有找到這個。謝謝您的回答。 – Anton 2012-04-17 17:17:20

+0

作爲一個額外的說明,然而,「所有權」被賦予佈局,而父級賦值是對佈局的父級窗口小部件進行的:http://doc.trolltech.com/4.7/qlayout.html#addItem – jdi 2012-04-17 17:25:31

+0

@jdi將* item *的所有權轉移到佈局。不是小部件本身的所有權。看看我的[答](http://stackoverflow.com/a/38003370/1951907),試圖澄清這一點。 QWidget的所有者(在內存管理意義上)始終是它的父窗口部件,因此不能作爲佈局。 – Boris 2016-06-23 23:22:04

2

不,QLayouts不採取管理QWidgets的所有權。

這裏是addWidget()實現:

void QLayout::addWidget(QWidget *w) 
{ 
    addChildWidget(w); 
    addItem(QLayoutPrivate::createWidgetItem(this, w)); 
} 

說明:

  1. addChildWidget()只是確保w是從其他佈局取出部件管理。

  2. createWidgetItem(this, w)分配一個新的QWidgetItem。此QWidgetItem存儲指向w的指針,但不接管w的所有權。

  3. addItem()添加項的佈局,並採取QWidgetItem的所有權(不是由QWidgetItem觀察QWidget的的)。這意味着當QLayout被銷燬時QWidgetItem將被銷燬。但是,QWidget w仍然不會被銷燬。

當QWidget的父QWidget被銷燬時,它將被銷燬。當調用parent-> setLayout(layout)時,此類父級由QLayout自動分配。