【问题标题】:When are widgets deleted in Qt (QVBoxLayout class)?Qt(QVBoxLayout 类)中的小部件何时被删除?
【发布时间】:2018-06-27 15:17:32
【问题描述】:

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

【问题讨论】:

  • 为了删除您的标签对象,您需要正确设置其父对象。一般来说,它应该是持有它的小部件,即 multiWidget 在你的情况下。
  • @vahancho 那么当mutliWidget 控制布局时,它是否也控制了布局中的小部件?它是为我删除label 吗?
  • 是的,multiWidget 将删除它的子对象label,如果它是在label 之前创建的。你可以参考这篇文章:doc.qt.io/qt-5/objecttrees.html.

标签: c++ qt shared-ptr


【解决方案1】:

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

【讨论】:

  • 如果您要使用布局,则无需指定父级,因为布局将由您的父级label = new QLabel(QLatin1String("TEST"));
猜你喜欢
  • 2010-12-24
  • 2012-02-14
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多