2010-09-21 7 views
9

Quello che sto cercando di ottenere è che un widget possa esistere in due layout diversi, in questo caso in QHBoxLayout e in QVBoxLayout. Sto implementando un sistema che cambia dinamicamente tra i due layout quando cambia l'orientamento dello schermo di un dispositivo.Qt: stesso widget all'interno di due layout diversi

Attualmente sto creando, diciamo un widget composito complesso chiamato myWidget e aggiungendo in un due diversi layout:

MyWidget *wgt = new QWidget(); 
QVBoxLayout vlayout; 
QHBoxLayout hlayout; 

vlayout->addWidget(wgt); 
hlayout->addWidget(wgt); 

Ora immaginate che entrambi i layout sono ospitati all'interno di un layout 'root', e che questo layout radice può ridimensionarsi in una modalità "orizzontale" più ampia di quella alta e in una modalità "ritratto" più alta che ampia.

MyWidget viene visualizzato correttamente solo nel primo layout in cui è stato aggiunto e quando i layout vengono commutati, mostra tutti i dati errati o non lo sono affatto.

Non so se qui abbia senso, ma questo è il mio problema. Forse quando viene chiamato l'evento switch, tutti i widget figlio e i layout dovrebbero essere ridimensionati, quindi sembrerebbe sempre giusto. L'unico problema è che non so come.

+0

questione connessa: http://stackoverflow.com/questions/2990283/qt-change-qwidget-layout – rubenvb

risposta

4

Questo non è particolarmente facile da fare, ma è possibile.

Prima di tutto, ti consiglio di creare due widget diversi, uno per la verticale e uno per l'orizzontale, e gestire le cose in questo modo. Se i dati di origine sono correttamente separati dalla classe dell'interfaccia utente, dovresti riuscire a farlo senza troppi problemi, ma incorrendo in un sovraccarico di memoria.

Un modo per fare ciò che desideri è completamente remove the widgets da un layout e aggiungerli all'altro quando è necessario modificare la disposizione sullo schermo e modificare il layout che viene aggiunto al widget. Ciò dovrebbe causare che gli stessi widget vengano disegnati in un modo diverso.

Un modo diverso e più complesso di gestire questo (anche se potenzialmente più efficiente) sarebbe a write your own layout e gestirlo riordinando i widget in base alla modifica dell'orientamento.

+1

ho deciso di scrivere un metodo che viene chiamato automaticamente quando cambia l'orientamento, che (dopo aver tolto) aggiunge i widget di nuovo nel layout. – Gerstmann

12

Questa non è una soluzione generale per la modifica dei layout, ma una soluzione semplice nel tuo caso: basta cambiare la direzione del riquadro.

hlayout->setDirection(QBoxLayout::TopToBottom); 
// now your hboxlayout works as vertical layout 

hlayout->setDirection(QBoxLayout::LeftToRight); 
// and now it is horizontal again 
Problemi correlati