c++ - 什么时候在 Qt 中删除小部件(QVBoxLayout 类)?

标签 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是私有(private)成员(member)QLabel* label .我的问题是:我是否负责删除 labelDock的析构函数?

我尝试更改代码以便 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”被销毁时它会被自动删除,但当我关闭程序时会出现错误。

最佳答案

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

关于c++ - 什么时候在 Qt 中删除小部件(QVBoxLayout 类)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51066334/

相关文章:

qt - 如何在 qt creator 中删除项目?

c++ - QWidget - 调整大小动画

python - 通过鼠标事件 PyQt 在 PyQt 窗口中创建一行

c++ - std::function 用于方法参数、复制还是shared_ptr?

javascript - 无法远程连接到 dlib 网络服务器,localhost 可以正常工作

c++ - 枚举与类同名成员函数

java - 在 Android 中从 Java 调用 C++ 库

c++ - CopyResource 从一个 D3D11 设备到另一个

c++ - 为什么我的程序在 boost::enable_shared_from_this<>/boost::shared_ptr<> 中崩溃?

c++ - 从哑指针 vector 切换到 boost::shared_ptr 时出现问题