2017-07-26 1 views
0

J'ai une classe simple qui hérite de QDialog, j'ajoute dynamiquement des éléments et mes éléments sont situés au centre, mais je veux les ajouter en haut.Pourquoi Qt :: AlignTop ne fonctionne pas dans QVBoxLayout que j'utilise comme mise en page principale?

class CustomDialog : public QDialog { 
    Q_OBJECT 
private: 
    QVBoxLayout *mainLayout; 
CustomDialog() 
{ 
    mainLayout = new QVBoxLayout(); 
    setLayout(mainLayout); 
} 
public: 
    void update() 
    { 
    QLabel* label = new QLabel("some text"); 

    QVBoxLayout *verLayout = new QVBoxLayout; 
    verLayout->addStretch(); 
    verLayout->setAlignment(Qt::AlignTop); 

    verLayout->addWidget(label, Qt::AlignTop); 
    mainLayout->setAlignment(Qt::AlignTop); 
    mainLayout->addLayout(verLayout, Qt::AlignTop); 
    } 
}; 

Qu'est-ce que je fais mal? et pourquoi mes éléments ajoutés dynamiquement toujours au centre?

Répondre

1

Je comprends que vous voulez le placer et que le haut est affiché, vous pouvez donc utiliser QSpacerItem pour le pousser.

class CustomDialog : public QDialog { 
    Q_OBJECT 
    QVBoxLayout *mainLayout; 

public: 
    CustomDialog(QWidget *parent=0): QDialog(parent) 
    { 
     mainLayout = new QVBoxLayout(this); 

     QSpacerItem *verticalSpacer = new QSpacerItem(20, 217, QSizePolicy::Minimum, QSizePolicy::Expanding); 
     mainLayout->addItem(verticalSpacer); 

     addWidgets("1"); 
     addWidgets("2"); 
    } 
private: 
    void addWidgets(const QString &text) 
    { 
     QLabel* label = new QLabel(text); 

     QVBoxLayout *verLayout = new QVBoxLayout; 
     verLayout->addStretch(); 
     verLayout->setAlignment(Qt::AlignTop); 

     verLayout->addWidget(label, Qt::AlignTop); 
     mainLayout->setAlignment(Qt::AlignTop); 
     mainLayout->insertLayout(mainLayout->count()-1, verLayout); 
    } 
}; 

enter image description here

Ou si vous le voulez avoir un ordre inverse, vous devez l'insérer dans la première position avec:

mainLayout->insertLayout(0, verLayout); 

enter image description here

Note: L'utilisation de addLayout est incorrect puisque le deuxième paramètre est stretch.