Qt (QVBoxLayout class) 什么时候删除小部件?

When are widgets deleted in Qt (QVBoxLayout class)?

我有一些使用 Qt 创建新小部件的简单代码:

Dock::Dock() : QDockWidget() {
    label = new QLabel(QLatin1String("TEST"));

    QVBoxLayout* layout = new QVBoxLayout();
    layout->addWidget(label, 0, Qt::AlignTop);
    layout->addStretch(-1);

    QWidget* multiWidget = new QWidget();
    multiWidget->setLayout(layout);

    setWidget(multiWidget);
}

其中 label 是私有成员 QLabel* label。我的问题是:我是否负责在 Dock 的析构函数中删除 label

我尝试更改代码,使 label 成为 std::shared_ptr<QLabel>:

Dock::Dock() : QDockWidget() {
    label = std::make_shared<QLabel>(QLatin1String("TEST"));

    QVBoxLayout* layout = new QVBoxLayout();
    layout->addWidget(label.get(), 0, Qt::AlignTop);
    layout->addStretch(-1);

    QWidget* multiWidget = new QWidget();
    multiWidget->setLayout(layout);

    setWidget(multiWidget);
}

所以当'Dock'被销毁时它会被自动删除但是当我关闭程序时出现错误

为了正确设置 objects tree 您需要执行以下操作:

  • 首先创建容器小部件,
  • 创建子部件并设置它的父部件,
  • 创建容器小部件的布局,
  • 将小部件添加到布局。

下面是演示上述方法的代码:

Dock::Dock()
  :
    QDockWidget()
{
  QWidget* multiWidget = new QWidget;
  label = new QLabel(QLatin1String("TEST"), multiWidget); // Set parent

  QVBoxLayout* layout = new QVBoxLayout(multiWidget); // Sets layout
  layout->addWidget(label, 0, Qt::AlignTop);
  layout->addStretch(-1);

  setWidget(multiWidget);
}