Я пытаюсь написать менеджер макетов, который способен отображать все добавленные виджеты, фильтровать их или изменять размер некоторых из них. У меня есть подкласс QWidget, который имеет текущий список виджетов, список всех виджетов, prevList виджетов, которые отображаются до последнего изменения. У этого также есть currentGrid (QGridLayout *), который показывает виджеты соответственно и mainLayout, который содержит сетку и некоторые кнопки.SegFault при попытке использовать ненулевой указатель на QGridLayout (Qt)
Если изменение происходит я вызываю функцию UpdateLayout которого резюме выглядит следующим образом: - Наполните prevList из currentGrid - Очистить и удалить mainLayout - Очистить currentGrid - Наполните currentGrid из CurrentList - создавать новые mainLayout - AddButtons - add currentGrid
Когда я добавляю только 1 виджет, он работает очень хорошо. Когда я попытался добавить второй, он дает segfault.
Вот как я очистить mainLayout
if(mainLayout) //clear mainLayout
{
while(mainLayout->count() > 0)
mainLayout->takeAt(0);
delete mainLayout;
}
Вот следующая строка этого кода и где происходит, выдаёт ошибку сегментации показал на (->).
if(currentGrid)
{
-->while(currentGrid->count() > 0)
{
currentGrid->takeAt(0);
}
}
Не удалять объекты QObject с удалением. Используйте deleteLater(). – Greenflow
Можете ли вы сказать мне, в чем разница? – uLtRaLoVeR
Qt-docs: ** Объект будет удален, когда управление вернется в цикл событий. ** QObjects может иметь «секретный» ресурс. Будь то из-за сигналов/слотов, будь то из-за событий. Например, в вашем случае вы удаляете элемент из макета, содержимое макета перестраивается. Событие может быть опубликовано, так что другие части gui могут действовать соответственно ... но с шумом отправитель удаляется. deleteLater() гарантирует, что объект будет удален, если это безопасно. – Greenflow