Когда виджеты удаляются в Qt (класс QVBoxLayout)? - PullRequest
0 голосов
/ 27 июня 2018

У меня есть простой код для создания нового виджета с использованием 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?

Я попытался изменить код, чтобы 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, но при закрытии программы выдается ошибка.

1 Ответ

0 голосов
/ 27 июня 2018

Чтобы правильно настроить дерево объектов , необходимо выполнить следующие действия:

  • Сначала создайте виджет контейнера,
  • Создать дочерний виджет и установить его родительский
  • Создать макет виджета контейнера,
  • Добавление виджета в макет.

Вот код, который демонстрирует упомянутый подход:

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);
}
...