2010-06-07 7 views
6

Considérons que nous avons un QWidget et un QLayout nommé general_layout qui contient d'autres widgets et mises en page. general_layout est défini comme la mise en page QWidget comme ceci:Qt - modifier la disposition QWidget

setLayout(general_layout) 

Maintenant je devrais changer le contenu de QWidget. Comment puis je faire ça? J'ai essayé de supprimer et de créer une nouvelle mise en page pour le QWidget et ce nouvel ensemble de mise en page comme une mise en page du QWidget, mais n'a pas pu terminer mes intentions avec succès.

Ceci est mon code:

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

Pourriez-vous être plus précis sur votre problème? Ce que vous faites semble être correct (c'est-à-dire supprimer l'ancienne mise en page avant d'en définir une nouvelle). – Job

+0

Bien sûr! Je fais ce qui suit: delete general_layout; general_layout = nouveau QHBoxLayout; general_layout-> addLayout (some_layout); myQWidget-> setLayout (general_layout); – Narek

Répondre

11

Le problème est que les widgets d'une mise en page ne sont pas détruits lors de la suppression d'une mise en page. Cela entraîne la présence de tous les widgets enfants de myQWidget, que ce soit sans mise en page.

La solution est simple: ajouter un

qDeleteAll(myQWidget->children()); 

après

delete general_layout; 
+0

Semble que c'était le problème. Merci beaucoup!!! Juste une autre question aussi. Je veux avoir un dialogue qui change sa structure (dans l'aspect de cette question). Donc, je fais cela avec la création de mise en page, la suppression et la création d'un nouveau. Est-ce une bonne approche? – Narek

+4

Peut-être si vous n'avez plus besoin de la première structure. Si vous le faites, utiliser QStackedLayout (http://doc.trolltech.com/latest/qstackedlayout.html) est beaucoup plus facile. Si vous essayez d'implémenter quelque chose comme un assistant, jetez un oeil à QWizard (http://doc.trolltech.com/latest/qwizard.html). – Job

+0

qDeleteAll (myQWidget-> children()); fonction supprime tous les enfants, mais qu'en est-il de l'enfant de l'enfant. Je veux dire dans les éléments enfants de myQWidget, il n'y a pas de disposition qui est la disposition enfant de general_layout. Quand j'appelle une méthode d'une mise en page enfant de general_layout, mon application explose (donc j'invite que le pointeur est détruit), mais quand je vérifie si elle est égale à 0 (m_childLayout_of_General_Layout == 0), alors if instruction est ignorée. Quel est le problème? Est-ce supprimé ou non? – Narek

Questions connexes