Qt 中的父子关系
Parent-Child relation in Qt
我想弄清楚 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 循环中创建的,这意味着它会在每次循环后超出范围。正常情况下,如果在循环内不删除,应该是内存泄漏。那么,它会导致这个程序内存泄漏吗?
- 是的。当为
QObject
指定父级时,它会取得该对象的所有权。当一个父对象被删除时,它会删除它所有的子对象(它拥有的所有对象);
- 原因是
setLayout
为小部件设置布局 并且 将此布局的所有权授予小部件。所以在 setLayout
被调用后,网格布局由 ButtonWidget
拥有,它会在需要时删除它(即当 ButtonWidget
本身将被删除时);
- 同2,调用
gridLayout->addWidget(button, i / 3, i % 3);
后,button
的所有权会发生变化。从技术上讲,addWidget
调用 addItem
,因此创建了 QWidgetItem
。布局取得 item 的所有权,而父窗口小部件取得 widget 的所有权。无论如何,按钮将在销毁它的父小部件时被销毁。
我想弄清楚 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 循环中创建的,这意味着它会在每次循环后超出范围。正常情况下,如果在循环内不删除,应该是内存泄漏。那么,它会导致这个程序内存泄漏吗?
- 是的。当为
QObject
指定父级时,它会取得该对象的所有权。当一个父对象被删除时,它会删除它所有的子对象(它拥有的所有对象); - 原因是
setLayout
为小部件设置布局 并且 将此布局的所有权授予小部件。所以在setLayout
被调用后,网格布局由ButtonWidget
拥有,它会在需要时删除它(即当ButtonWidget
本身将被删除时); - 同2,调用
gridLayout->addWidget(button, i / 3, i % 3);
后,button
的所有权会发生变化。从技术上讲,addWidget
调用addItem
,因此创建了QWidgetItem
。布局取得 item 的所有权,而父窗口小部件取得 widget 的所有权。无论如何,按钮将在销毁它的父小部件时被销毁。