Как правильно очистить память от массива QPushButton?

Я сделал SrollArea и размещаю в нём кнопки с картинками. Создал массив, чтобы потом можно было с кнопками взаимодействовать (назначить им действие при нажатии). И теперь возник вопрос, как (и нужно ли) чистить, выделенную под него память?

QIcon icon;
const QSize btnSize = QSize(150, 150), iconSize = QSize(100, 100);
Items* item = new Items();
QPushButton** btnArr = new QPushButton*[689]; 
QScrollArea* scroll = new QScrollArea;
    QGridLayout* layout = new QGridLayout;
    for(int i = 0, itemNumber = 0; i < 138; ++i){
        for(int y = 0; y < 5; ++y, ++itemNumber){
            if (itemNumber < 689){
                icon = QIcon("images/" + item->items[itemNumber]);
                //item->items[itemNumber] это получение имени картинки из массива items (там 689 названий картинок,
                //которые нужно установить на кнопки
                btnArr[itemNumber] = new QPushButton("", this); //и здесь я добавляю саму кнопку в массив btnArr
                btnArr[itemNumber]->setIcon(icon);
                btnArr[itemNumber]->setIconSize(iconSize);
                btnArr[itemNumber]->setFixedSize(btnSize);
                layout->addWidget(btnArr[itemNumber],i,y);
            }
        }
    }
    QWidget* widget = new QWidget;
    widget -> setLayout(layout);
    scroll -> setWidget(widget);
    scroll ->showNormal();
    //for (int i = 0; i < 689; ++i) delete btnArr[i];
    delete [] btnArr;
    delete item; //это очистка памяти от экземпляра класса, где хранятся названия картинок

Если убрать комментарии от //for (int i = 0; i < 689; ++i) delete btnArr[i];, то он просто уничтожит все кнопки. Но очистка указателей на них ни к чему не приводит (её нужно будет потом вынести подальше, чтобы указатели не уничтожались почти сразу после создания). Как мне очистить память от этих кнопок, и других виджетов, созданных через new (если это вообще нужно), и от массива btnArr?


Ответы (1 шт):

Автор решения: gbg

Для этого в Qt придумано отношения родительства. Нужно указывать при создании кнопок родительский объект, и тогда Qt самостоятельно все потрет, когда нужно будет.

Что касается создания массива кнопок при помощи new - это неудачный подход. Для этого хорошо работает std::vector - он и помнит, сколько в нем чего хранится, и не протекает, выходя за область видимости.

Очень вероятно, что помнить указатели на кнопки вам просто не нужно - создали кнопку, подвязали к родителю, подцепили к сигналам, да и забыли о ней.

→ Ссылка