2009-08-25 3 views
10

Ich versuche, ein zweispaltiges Standardformular zu erstellen, wobei die erste Spalte eine Textbeschriftung (QLabel) und die zweite Spalte ein interaktives Widget, normalerweise ein Textfeld (QLineEdit) ist. Wir haben uns entschieden, Formularzeilen innerhalb eines QGroupBox und damit in einem anderen Layout als das Hauptlayout zu platzieren. Somit sind die Formelemente innerhalb jeder QGroupBox nicht horizontal mit den Formelementen außerhalb der QGroupBox es.Wie richte ich in Qt Formularelemente in verschiedenen Gruppenfeldern aus?

Wie kann ich Gruppenrahmen und Layouts so verwenden, dass die Gruppenfelder QLabel s und QLineEdit sowohl innerhalb als auch außerhalb von Gruppen (horizontal) miteinander ausgerichtet sind?

Danke!

Antwort

4

Sie die Eigenschaft auf Minimum alle Etiketten in den Gruppenfeldern zu etwas, das gerade breit genug ist, um anzuzeigen das breiteste Etikett einstellen. Dadurch werden alle Etiketten in den verschiedenen Gruppenfeldern ausgerichtet.

Jetzt, um die Etiketten außerhalb der Groupboxes mit denen innerhalb ausgerichtet: Zuerst nehme ich an, dass jedes Label/Lineedit-Paar in einem eigenen horizontalen Layout ist oder dass Sie mehrere Zeilen innerhalb eines Rasters haben. In beiden Fällen können Sie die Mindestbreite der Beschriftungen auf denselben Wert einstellen wie die Beschriftungen in den Gruppenkästen. Passen Sie schließlich die Eigenschaften layoutLeftMargin, layoutRightMargin und layoutSpacing für das horizontale (oder Raster-) Layout an, bis die rechten und linken Kanten des Paars label/lineedit mit denen in den Gruppenfeldern übereinstimmen.

Wenn Sie den Formular-Editor in Qt Creator oder Qt Designer noch nicht zum Erstellen Ihrer Benutzeroberfläche verwenden, habe ich festgestellt, dass diese Aufgabe relativ einfach ist.

Ich muss zugeben, das fühlt sich ein wenig klumpig an, aber in dem einfachen Testfall, den ich gebaut habe, schien es in Ordnung zu sein. Auf der anderen Seite scheint dies zu brechen, wenn der Benutzer die Schriftgröße ändert. Vielleicht gibt es einen besseren Weg?

Hoffe, das hilft.

+0

Ich werde dies eine Chance geben - ich werde Sie wissen lassen, wie es geht. – swongu

+0

Ich habe die zweite Komponente nicht getestet, aber ich kann Ihnen sagen, dass das Einstellen der Mindestbreite der Labels innerhalb der Gruppenboxen der obersten Ebene auf magische Weise funktioniert. Siehe meine eigene Antwort für Pseudocode. – swongu

1

Ich glaube nicht, dass es mit Sets von verschachtelten horizontalen und vertikalen Layouts arbeiten wird. Haben Sie eine QGridLayout in Betracht gezogen?

+0

Ich brauche Formularelemente innerhalb der unterschiedlichen Gruppenfelder, so leider werde ich anders/verschachtelte Layouts benötigt. Ich benutze bereits 'QGridLayout', eigentlich! – swongu

0

Verwenden setGeometry() zu zwingen, alle Ihre Spalten auf die gleiche Breite

+0

Würden das Layout-Richtlinien nicht brechen? – swongu

1

kenrogers zur Verfügung gestellt, die Lösung, und hier ist eine unvollständige Code, dass ich es zum Laufen zu bringen verwendet:

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) ; 
}