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);
}
  1. signalMapper

    因为是带参数this构造的,父对象ButtonWidget被删除时,它也被删除

    这是正确的吗?

  2. gridLayout

    为什么 gridLayout 不需要由 new QGridLayout(this) 创建?

  3. button

    它是在 for 循环中创建的,这意味着它会在每次循环后超出范围。正常情况下,如果在循环内不删除,应该是内存泄漏。那么,它会导致这个程序内存泄漏吗?

  1. 是的。当为 QObject 指定父级时,它会取得该对象的所有权。当一个父对象被删除时,它会删除它所有的子对象(它拥有的所有对象);
  2. 原因是 setLayout 为小部件设置布局 并且 将此布局的所有权授予小部件。所以在 setLayout 被调用后,网格布局由 ButtonWidget 拥有,它会在需要时删除它(即当 ButtonWidget 本身将被删除时);
  3. 同2,调用gridLayout->addWidget(button, i / 3, i % 3);后,button的所有权会发生变化。从技术上讲,addWidget 调用 addItem,因此创建了 QWidgetItem。布局取得 item 的所有权,而父窗口小部件取得 widget 的所有权。无论如何,按钮将在销毁它的父小部件时被销毁。