2009-08-25 5 views
10

Sto cercando di creare un modulo a due colonne standard, in cui la prima colonna è un'etichetta di testo (QLabel) e la seconda colonna è un widget interattivo, in genere un campo di testo (QLineEdit). Abbiamo deciso di posizionare le righe del modulo che condividono un tema comune all'interno di un QGroupBox e quindi in un layout separato rispetto al layout principale. Pertanto, gli elementi del modulo all'interno di ogni QGroupBox non si allineano orizzontalmente con gli elementi del modulo all'esterno dello QGroupBox es.In Qt, come allineare gli elementi del modulo in diverse caselle di gruppo?

Come è possibile utilizzare caselle di gruppo e layout in modo che le caselle QLabel se QLineEdit s sia all'interno che all'esterno delle caselle di gruppo siano allineate orizzontalmente l'una con l'altra?

Grazie!

risposta

4

È possibile impostare la proprietà MinimumWidth su tutte le etichette all'interno dei groupboxes a qualcosa che è ampio abbastanza per visualizzare l'etichetta più ampia. Ciò consentirà di allineare tutte le etichette all'interno delle diverse caselle di gruppo.

Ora, per ottenere le etichette all'esterno delle groupbox allineate con quelle interne: innanzitutto, presumo che ogni coppia etichetta/linea sia nel proprio layout orizzontale o che ci siano più righe all'interno di una griglia. In entrambi i casi, ciò che puoi fare è impostare la larghezza minima delle etichette sullo stesso valore delle etichette nelle groupbox. Infine, regola le proprietà layoutLeftMargin, layoutRightMargin e layoutSpacing sul layout orizzontale (o griglia) finché i bordi destro e sinistro della coppia label/lineedit non si allineano con quelli all'interno delle groupbox.

Se non si sta già utilizzando l'Editor moduli in Qt Creator o Qt Designer per creare l'interfaccia utente, ho trovato che semplificare questa operazione.

Devo ammettere che mi sembra un po 'imbarazzante, ma nel caso di test semplice che ho costruito, sembrava funzionare bene. D'altra parte, sembra probabile che si interrompa se l'utente cambia la dimensione del carattere. Forse c'è un modo migliore?

Spero che questo aiuti.

+0

Darò uno scatto - ti farò sapere come va. – swongu

+0

Non ho provato il secondo componente, ma posso dire che l'impostazione della larghezza minima delle etichette all'interno delle caselle di gruppo di livello superiore ha funzionato magicamente. Vedi la mia risposta per lo pseudocodice. – swongu

1

Non credo che funzionerà con insiemi di layout orizzontali e verticali annidati. Hai considerato un QGridLayout?

+0

ho bisogno di elementi del modulo all'interno di diverse caselle di gruppo, così purtroppo avrò bisogno di layout differenti/nidificato. Sto già usando 'QGridLayout', in realtà! – swongu

0

Usa setGeometry() per forzare tutte le colonne alla stessa larghezza

+0

Non si rompono le politiche di layout? – swongu

1

kenrogers fornito la soluzione, e qui è un codice incompleto che ho usato per farlo funzionare:

int width = 0 ; 
QDialog* dialog ; 
QList<QGridLayout*> layouts = dialog->findChildren<QGridLayout*>() ; 
QList<QLabel*> labels ; 
foreach (QGridLayout* layout, layouts) 
{ 
    // Loop through each layout and get the label on column 0. 
    QLabel* foundLabel ; 
    labels << foundLabel ; 

    // Get the width. 
    width = qMax(foundLabel->width(), width) ; 
} 

foreach (QLabel* label, labels) 
{ 
    label->setMinimumWidth(width) ; 
} 
Problemi correlati