Qt(QVBoxLayout类)何时删除窗口小部件?

时间:2018-06-27 15:17:32

标签: c++ qt shared-ptr

我有一些简单的代码可以使用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。我的问题是:我应该删除label的析构函数中的Dock吗?

我尝试更改代码,以使labelstd::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”时将其自动删除,但是在关闭程序时出现错误。

1 个答案:

答案 0 :(得分:2)

为了正确设置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);
}