QT как правильно удалять элементы управления?

Картежник
Дата: 21.04.2015 07:22:46
есть дин.массив элементов управления
создаю следующим образом
for(int i=0;i<but_count;i++){
  buttons.push_back(new QmyButton());
  buttons[i]->setParent(widget_1);
  ...
}


первый раз создается нормально
теперь удаляю
for(int i=but_count-1;i>=0;i--){
  buttons[i]->deleteLater();
  ...
}
//потом еще на всякий случай
buttons.clear();


после этого на widget_1 остаются эти элементы, хоть и не реагируют на события (клики и т.д.)

после этого меняется but_count и элементы строятся заново, и хорошо если до этого кол-во элементов было меньше, а вот когда до этого кол-во элементов было больше, а теперь меньше то остаются старые элементы(или их след).
Картежник
Дата: 21.04.2015 07:51:51
Пока что решил следующим способом
перед тем как удалить, скрываю элемент

for(int i=but_count-1;i>=0;i--){
  buttons[i].hide();
  buttons[i]->deleteLater();
  ...
}
egorych
Дата: 21.04.2015 12:02:13
Картежник, а если бы ты в конструктор QmyButton() передавал правильный парент, то тебе бы не пришлось думать за удаление, Qt сама бы удалила всё, при удалении этого парента.
Картежник
Дата: 21.04.2015 12:58:16
egorych,
а я же парента не удаляю.
MasterZiv
Дата: 21.04.2015 13:37:26
Картежник,

Поясни, что ты понимаешь под словом "удаляю".

После
buttons[i]->setParent(widget_1);

в QT удалять уже ничего не нужно.
Картежник
Дата: 21.04.2015 14:00:28
MasterZiv
Картежник,

Поясни, что ты понимаешь под словом "удаляю".

После
buttons[i]->setParent(widget_1);

в QT удалять уже ничего не нужно.


после buttons[i]->setParent(widget_1);
я удаляю не widget_1, a buttons[i].

так как widget_1 мне еще нужен будет для последующих buttons[i] которые создам после.
egorych
Дата: 21.04.2015 15:09:43
Картежник
после buttons[i]->setParent(widget_1);
я удаляю не widget_1, a buttons[i].

так как widget_1 мне еще нужен будет для последующих buttons[i] которые создам после.
очень странный дизайн у тебя.
MasterZiv
Дата: 21.04.2015 15:11:31
egorych
Картежник
после buttons[i]->setParent(widget_1);
я удаляю не widget_1, a buttons[i].

так как widget_1 мне еще нужен будет для последующих buttons[i] которые создам после.
очень странный дизайн у тебя.


Согласен.
Зачем тогда setParent вызывать ?
Не вызывай тогда setParent, удаляй виджеты руками...
Картежник
Дата: 21.04.2015 16:48:20
MasterZiv
...
Согласен.
Зачем тогда setParent вызывать ?
Не вызывай тогда setParent, удаляй виджеты руками...

ну setParent указывается на каком виджете должен отображаться этот элемент,чтоб в воздухе не висел.
там получается так:
загружается список приложений, для каждого приложения создается своя кнопка, и все эти кнопки по порядку отображаются в widget_1 (через setParent), затем если вдруг список изменился, например категория другая, то там другой список загружается, и теперь для него создаются заново кнопки(старые кнопки удаляются), и опять же отображаются в widget_1.