Как изменить / поменять расположение виджета? - PullRequest
2 голосов
/ 16 сентября 2010

Я работаю над приложением, в котором мне нужно изменить макет моей текущей вкладки при нажатии переключателя.

Я использую следующий код для замены макета:

changed_layout = new QVBoxLayout;
label1 = new QLabel(string);
delete main_layout;
changed_layout->addWidget(label1);
setLayout(changed_layout);

Но когда я нажимаю кнопку, программное обеспечение завершается (вылетает).

1 Ответ

0 голосов
/ 16 сентября 2010

Не следует пытаться напрямую удалить 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 в верхней части иерархии с различными макетами, которые мне нужно было бы установить внутри него, а затем переместил бы дочерние виджеты из макета в макет без необходимости и уничтожить их во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...