2010-06-07 3 views
6

Рассмотрим, что у нас есть QWidget и QLayout с именем general_layout, который содержит другие виджеты и макеты. general_layout устанавливаются как QWidget макет, как это:Qt - изменить макет QWidget

setLayout(general_layout) 

Теперь я должен изменить содержание QWidget. Как я могу это сделать? Я попытался удалить и создать новый макет для QWidget, и этот новый макет был установлен как макет QWidget, но не смог успешно завершить мои намерения.

Это мой код:

delete general_layout; 
general_layout = new QHBoxLayout; 
general_layout->addLayout(some_layout); 
myQWidget->setLayout(general_layout); 
+0

вы могли бы быть более конкретную информацию о вашей проблеме? То, что вы делаете, кажется правильным (например, удалите старый макет перед установкой нового). – Job

+0

Конечно! Я делаю следующее: delete general_layout; general_layout = новый QHBoxLayout; general_layout-> addLayout (some_layout); myQWidget-> setLayout (general_layout); – Narek

ответ

11

Проблема заключается в том, что виджеты макета не разрушаются при удалении макета. В результате все дочерние виджеты myQWidget все еще присутствуют, будь то без макета.

Решение простое: добавить

qDeleteAll(myQWidget->children()); 

после

delete general_layout; 
+0

Кажется, это была проблема. Большое спасибо!!! Еще один вопрос. Я хочу иметь диалог, который изменяет его структуру (в аспекте этого вопроса). Поэтому я делаю это с созданием макета, удалением и созданием нового. Это хороший подход? – Narek

+4

Может быть, если вам больше не нужна первая структура. Если вы это сделаете, использование QStackedLayout (http://doc.trolltech.com/latest/qstackedlayout.html) намного проще. Если вы пытаетесь реализовать что-то вроде мастера, взгляните на QWizard (http://doc.trolltech.com/latest/qwizard.html). – Job

+0

qDeleteAll (myQWidget-> children()); функция удаляет все дочерние элементы, но что касается дочернего элемента childs. Я имею в виду, что в дочерних элементах myQWidget нет макетов, которые представляют собой дочерние макеты general_layout. Когда я вызываю метод дочернего макета general_layout, мое приложение взрывается (так что я гость, что указатель уничтожен), но когда я проверяю, равен ли он 0 (m_childLayout_of_General_Layout == 0), то оператор if игнорируется. Что случилось? Удалено или нет? – Narek

Смежные вопросы