Не следует пытаться напрямую удалить QObjects
с помощью delete
, позвонить ojbect->deleteLater()
и установить указатель на null
. Инфраструктура Qt безопасно удалит объект после выхода из любых слотов и возврата элемента управления в цикл событий.
В вашем коде измените строку delete main_layout;
на:
main_layout->deleteLater();
main_layout = NULL;
Обновление:
Комментарий от Стива С. правильный. Цитировать документы Qt для setLayout()
..
Если там уже есть менеджер раскладок
установлен на этот виджет, QWidget
не позволит вам установить другой. Вы
необходимо сначала удалить существующий макет
менеджер (возвращается макетом ()) перед
Вы можете вызвать setLayout () с новым
layout.layout.
Поскольку setLayout()
- это особый случай переопределения виджетов, мы должны сначала удалить старый макет, а затем установить новый макет. Нам нужно быть очень уверенными в стеке сигналов / слотов, который мы собираемся вызвать delete()
.
Альтернативой может быть установка новой компоновки в максимально возможной степени, а затем подключение слота к старому сигналу destroyed()
компоновок, а затем вызов deleteLater()
для него. В слоте для сигнала destroy () вы сможете вызвать setLayout()
с новой раскладкой.
Если это звучит сложно, то это потому, что это так. Изменение и уничтожение макетов во время выполнения необычно. Если бы я обнаружил, что мне нужно сделать что-то подобное, я, вероятно, создал бы что-то вроде gridLayout в верхней части иерархии с различными макетами, которые мне нужно было бы установить внутри него, а затем переместил бы дочерние виджеты из макета в макет без необходимости и уничтожить их во время выполнения.