2009-08-25 5 views
10

J'essaie de créer un formulaire standard à deux colonnes, où la première colonne est une étiquette de texte (QLabel) et la deuxième colonne est un widget interactif, généralement un champ de texte (QLineEdit). Nous avons décidé de placer des lignes de formulaire qui partagent un thème commun à l'intérieur d'un QGroupBox, et donc dans une mise en page séparée de la mise en page principale. Ainsi, les éléments de formulaire à l'intérieur de chaque QGroupBox ne s'alignent pas horizontalement avec les éléments de formulaire en dehors des QGroupBox es.Dans Qt, comment aligner des éléments de formulaire dans différentes zones de groupe?

Comment puis-je utiliser des boîtes de groupe et des mises en page de sorte que les boîtes QLabel et QLineEdit à l'intérieur et à l'extérieur des boîtes de groupe soient (horizontalement) alignées les unes avec les autres?

Merci!

Répondre

4

Vous pouvez définir la propriété minimumWidth sur toutes les étiquettes à l'intérieur des zones de groupe à quelque chose qui est juste assez large pour afficher la plus grande étiquette. Cela va aligner toutes les étiquettes dans les différentes boîtes de groupe. Maintenant, pour obtenir l'alignement des étiquettes en dehors des groupboxes: Premièrement, je suppose que chaque paire label/lineedit est dans sa propre disposition horizontale, ou que vous avez plusieurs lignes à l'intérieur d'une grille. Dans les deux cas, ce que vous pouvez faire est de définir la largeur minimale des étiquettes à la même valeur que les étiquettes dans les boîtes de groupe. Enfin, ajustez les propriétés layoutLeftMargin, layoutRightMargin et layoutSpacing dans la disposition horizontale (ou grille) jusqu'à ce que les bords droit et gauche de la paire label/lineedit s'alignent sur ceux des groupes.

Si vous n'utilisez pas déjà l'éditeur de formulaires dans Qt Creator ou Qt Designer pour créer votre interface utilisateur, je l'ai trouvé assez simple.

Je dois admettre que cela me semble un peu éloquent, mais dans le cas de test simple que j'ai construit, ça semblait fonctionner. D'un autre côté, cela semble susceptible de se casser si l'utilisateur change la taille de la police. Peut-être qu'il y a un meilleur moyen?

Espérons que cela aide.

+0

Je vais essayer, je vous dirai comment ça se passe. – swongu

+0

Je n'ai pas essayé le second composant, mais je peux vous dire que le réglage de la largeur minimale des étiquettes dans les boîtes de groupe de haut niveau a fonctionné comme par magie. Voir ma propre réponse pour le pseudocode. – swongu

1

Je ne pense pas que cela fonctionnera avec des ensembles de dispositions horizontales et verticales imbriquées. Avez-vous considéré un QGridLayout?

+0

J'ai besoin des éléments de formulaire dans différentes zones de groupe, donc, malheureusement, je aurai besoin différentes mises en page/imbriqué. J'utilise déjà 'QGridLayout', en fait! – swongu

0

Utilisez setGeometry() pour forcer toutes vos colonnes à la même largeur

+0

Ne serait-ce pas casser les politiques de mise en page? – swongu

1

kenrogers a fourni la solution, et voici un code incomplet que je l'habitude de le faire fonctionner:

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