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);
}
我有一些使用 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);
}