2011-08-10 5 views
0

Je suis assez nouveau sur QT et j'ai fait ma première sous-classe QWidget personnalisée ... tout fonctionne bien, jusqu'à ce que j'essaie d'y ajouter des étiquettes. Ils sont tous écrasés dans le coin supérieur.problèmes de mise en page QWidget personnalisés

Voici mon code:

ARView::ARView(QWidget *parent, const char *name) { 
deviceLBL = new QLabel(this); 
targetLBL = new QLabel(this); 
deviceHeadingLBL = new QLabel(this); 
targetHeadingLBL = new QLabel(this); 
distanceLBL = new QLabel(this); 

QVBoxLayout *layout = new QVBoxLayout(); 

layout->addWidget(deviceLBL); 
layout->addWidget(targetLBL); 
layout->addWidget(deviceHeadingLBL); 
layout->addWidget(targetHeadingLBL); 
layout->addWidget(distanceLBL); 

this->setLayout(layout); 

this->setupLocationUpdates(); 

}

Est-ce que quelqu'un sait ce que je fais mal? Pourquoi toutes ces étiquettes ne sont-elles pas disposées dans une grille? Ou, s'ils le sont, pourquoi la grille n'utilise-t-elle pas tout l'espace disponible de ma sous-classe?

Cheers,

James

Répondre

0

Après avoir créé vos widgets que vous devez les ajouter à la disposition de la grille.

Voir la méthode addWidget() de QGridLayout.

+0

Merci pour la suggestion, j'ai essayé cela, mais le résultat est le même. (J'ai mis à jour mon message original pour inclure le nouveau code). – James

+0

Utilisez les valeurs de ligne et de colonne. Vous ne les utilisez pas. layout-> addWidget (deviceLBL, 0,0); layout-> addWidget (targetLBL, 0,1); etc. –

+0

Merci pour la suggestion. J'ai essayé ceci, mais les valeurs ne sont pas des valeurs de ligne et de colonne. La première est une valeur d'étirement et la seconde est une valeur d'alignement. Quelle est la bonne façon de définir les lignes et les colonnes s'il vous plaît? – James

1

Peut-être que le nom est décevant, mais un QVBoxLayout n'est pas une disposition de grille. C'est une disposition de boîte verticale. Ce qui signifie qu'il est supposé mettre en forme vos éléments de haut en bas dans l'ordre dans lequel vous les ajoutez.

Donc ce que vous voulez est en fait un QGridLayout. Si vous regardez la documentation de ce genre de mise en page vous verrez les fonctions suivantes:

void addWidget (QWidget * widget, int row, int column, Qt::Alignment alignment = 0) 
void addWidget (QWidget * widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0) 

Ceux-ci devraient vous permettre de mettre vos widgets où vous voulez dans une grille. Donc le code que j'ai ajouté ci-dessous placera deviceLBL et targetLBL sur la première ligne, deviceHeadingLBL, et targetHeadingLBL sur la deuxième ligne, et juste pour le plaisir, distanceLBL sur la troisième ligne mais en prenant 2 colonnes d'espace.

QGridLayout *layout = new QGridLayout(); 

layout->addWidget(deviceLBL, 0, 0); 
layout->addWidget(targetLBL, 0, 1); 
layout->addWidget(deviceHeadingLBL, 1, 0); 
layout->addWidget(targetHeadingLBL, 1, 1); 
layout->addWidget(distanceLBL, 2, 0, 1, 2); 

Ce qui devrait ressembler à ceci:

enter image description here