【发布时间】: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