我想澄清在new
创建子项时如何删除子项的概念。
此代码示例来自http://doc.qt.io/qt-4.8/qsignalmapper.html
ButtonWidget::ButtonWidget(QStringList texts, QWidget *parent)
: QWidget(parent)
{
signalMapper = new QSignalMapper(this);
QGridLayout *gridLayout = new QGridLayout;
for (int i = 0; i < texts.size(); ++i) {
QPushButton *button = new QPushButton(texts[i]);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button, texts[i]);
gridLayout->addWidget(button, i / 3, i % 3);
}
connect(signalMapper, SIGNAL(mapped(const QString &)),
this, SIGNAL(clicked(const QString &)));
setLayout(gridLayout);
}
signalMapper
由于它是使用参数this
构造的,当删除父对象ButtonWidget
时,它也会被删除。
这是对的吗?
gridLayout
为什么gridLayout
不需要创建new QGridLayout(this)
?
button
它是在for循环中创建的,这意味着它在每个循环后都将超出范围。在正常情况下,如果在循环内没有删除,则应该有内存泄漏。那么,这个程序会导致内存泄漏吗?
答案 0 :(得分:5)
QObject
指定父级时,它将获得该对象的所有权。删除父对象时,它将删除它的所有子对象(它拥有的所有对象); setLayout
为窗口小部件设置布局,将此布局的所有权赋予窗口小部件。因此,在调用setLayout
之后,网格布局由ButtonWidget
拥有,并在需要时删除它(即当ButtonWidget
本身将被删除时); gridLayout->addWidget(button, i / 3, i % 3);
后,button
的所有权将发生变化。从技术上讲,addWidget
会调用addItem
,因此会创建QWidgetItem
。布局取得项的所有权,父窗口小部件取得小部件的所有权。无论如何,按钮将在销毁它的父窗口小部件时销毁。