Как правильно очистить память от массива 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 шт):
Для этого в Qt придумано отношения родительства. Нужно указывать при создании кнопок родительский объект, и тогда Qt самостоятельно все потрет, когда нужно будет.
Что касается создания массива кнопок при помощи new - это неудачный подход. Для этого хорошо работает std::vector - он и помнит, сколько в нем чего хранится, и не протекает, выходя за область видимости.
Очень вероятно, что помнить указатели на кнопки вам просто не нужно - создали кнопку, подвязали к родителю, подцепили к сигналам, да и забыли о ней.