Qt(QVBoxLayout类)中的小部件何时删除?

When are widgets deleted in Qt (QVBoxLayout class)?

本文关键字:小部 何时 删除 QVBoxLayout Qt      更新时间:2023-10-16

我有一些简单的代码来使用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"被销毁时自动删除它,但在关闭程序时出现错误。

为了正确设置对象树,您需要执行以下操作:

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

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

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);
}