C ++, Qt: освобождение «неатрибутивных» объектов, созданных в конструкторе

0

В следующем примере класса Qt в конструкторе и в функциях, вызываемых конструктором, создается много объектов, но они не указываются указателями атрибутов и, как я понял, не могут быть удалены в деструкторе (нет в укажите в любом из файлов ключевое слово delete).

http://qt-project.org/doc/qt-4.8/widgets-groupbox.html

в window.h

class Window : public QWidget
{
    Q_OBJECT

public:
     Window(QWidget *parent = 0);

private:
     QGroupBox *createFirstExclusiveGroup();
     QGroupBox *createSecondExclusiveGroup();
     QGroupBox *createNonExclusiveGroup();
     QGroupBox *createPushButtonGroup();
};

в window.cpp

Window::Window(QWidget *parent)
     : QWidget(parent)
 {
     QGridLayout *grid = new QGridLayout;
     grid->addWidget(createFirstExclusiveGroup(), 0, 0);
     grid->addWidget(createSecondExclusiveGroup(), 1, 0);
     grid->addWidget(createNonExclusiveGroup(), 0, 1);
     grid->addWidget(createPushButtonGroup(), 1, 1);
     setLayout(grid);

     setWindowTitle(tr("Group Boxes"));
     resize(480, 320);
 }

 QGroupBox *Window::createFirstExclusiveGroup()
 {
     QGroupBox *groupBox = new QGroupBox(tr("Exclusive Radio Buttons"));

     QRadioButton *radio1 = new QRadioButton(tr("&Radio button 1"));
     QRadioButton *radio2 = new QRadioButton(tr("R&adio button 2"));
     QRadioButton *radio3 = new QRadioButton(tr("Ra&dio button 3"));

     radio1->setChecked(true);

     QVBoxLayout *vbox = new QVBoxLayout;
     vbox->addWidget(radio1);
     vbox->addWidget(radio2);
     vbox->addWidget(radio3);
     vbox->addStretch(1);
     groupBox->setLayout(vbox);

     return groupBox;
 }

Я что-то пропустил или это "плохой" пример реализации? Будет ли правильная реализация ставить указатели как атрибут класса Window и уничтожать то, что они указывают в ~ Window()? Спасибо.

Теги:
qt
memory-management
new-operator

1 ответ

2
Лучший ответ

Поскольку все объекты добавляются в дерево объектов, они автоматически удаляются.

Например, все виджеты добавляются в макет, а сам макет устанавливается в окне. Это создает дерево объектов.

Вы можете использовать метод QObject::dumpObjectTree() чтобы получить визуальное представление текущего дерева объектов.

См. Также " Деревья объектов" и "Собственность" в документации Qt.

  • 0
    IOW: родители в дереве объектов владеют своими детьми, и ~QWidget() уничтожит их в конце. : D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню