2010-06-07 13 views
6

Consideriamo che abbiamo un QWidget e un QLayout denominato general_layout che contiene altri widget e layout. general_layout è impostato come il layout QWidget in questo modo:Qt - modifica layout QWidget

setLayout(general_layout) 

Ora dovrei cambiare il contenuto di QWidget. Come lo posso fare? Ho provato a eliminare e creare un nuovo layout per QWidget e il nuovo layout impostato come layout di QWidget, ma non è riuscito a completare le mie intenzioni correttamente.

Questo è il mio codice:

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

Potrebbe essere più preciso circa il tuo problema? Quello che stai facendo sembra essere corretto (es. Cancellare il vecchio layout prima di impostarne uno nuovo). – Job

+0

Sicuro! Faccio quanto segue: delete general_layout; general_layout = new QHBoxLayout; general_layout-> addLayout (some_layout); myQWidget-> setLayout (general_layout); – Narek

risposta

11

Il problema è che i widget di un layout non vengono distrutti durante l'eliminazione di un layout. Ciò si traduce in tutti i widget figli di myQWidget ancora presenti, sia senza un layout.

La soluzione è semplice: aggiungere un

qDeleteAll(myQWidget->children()); 

dopo

delete general_layout; 
+0

Sembra che questo fosse il problema. Molte grazie!!! Ancora una domanda. Voglio avere una finestra di dialogo che cambi la sua struttura (nell'aspetto di questa domanda). Quindi lo faccio creando il layout, cancellandolo e creando uno nuovo. E 'un buon approccio? – Narek

+4

Potrebbe essere se non hai più bisogno della prima struttura. Se lo fai, usare QStackedLayout (http://doc.trolltech.com/latest/qstackedlayout.html) è molto più facile. Se stai cercando di implementare qualcosa come un mago, dai un'occhiata a QWizard (http://doc.trolltech.com/latest/qwizard.html). – Job

+0

qDeleteAll (myQWidget-> children()); la funzione elimina tutti i childs, ma per quanto riguarda child of the childs. Intendo negli elementi figli di myQWidget non ci sono layout che sono layout figlio di general_layout. Quando chiamo un metodo di un layout figlio di general_layout, la mia applicazione esplode (quindi mi fa piacere che il puntatore venga distrutto), ma quando controllo se è uguale a 0 (m_childLayout_of_General_Layout == 0), allora se l'istruzione viene ignorata. Che cosa c'é? È cancellato o no? – Narek