web-dev-qa-db-fra.com

QVBoxLayout: comment aligner verticalement les widgets vers le haut au lieu du centre

Dans Qt, lorsque j'ajoute des widgets à ma disposition, ils sont centrés verticalement par défaut. Existe-t-il un moyen de "répertorier" les widgets de haut en bas au lieu de les centrer verticalement?

40
sFuller

utilisez la méthode void QLayout::setAlignment ( Qt::Alignment alignment ) pour définir l'alignement selon votre choix.

38
Kunal

Je trouve cela un peu plus compliqué que d'utiliser simplement layout.setAlignment(). Cela ne fonctionnait pas pour moi jusqu'à présent, quand j'ai compris que si vous avez des widgets extensibles pour lesquels vous définissez une hauteur maximale, ce widget ne sera pas aligné comme vous le souhaitez.

Voici un exemple de code qui fait pas aligner le widget QTextBrowser() même si j'appelle layout.setAlignment(Qt.AlignTop). Désolé qu'il soit en Python, mais il est assez facile à traduire en C++ (je suis allé dans l'autre sens plusieurs fois).

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyWidget(QWidget):
    """
    Create a widget that aligns its contents to the top.
    """

    def __init__(self, parent=None):

        QWidget.__init__(self, parent)

        layout = QVBoxLayout()

        label = QLabel('label:')
        layout.addWidget(label)

        info = QTextBrowser(self)
        info.setMinimumHeight(100)
        info.setMaximumHeight(200)
        layout.addWidget(info)        
        # Uncomment the next line to get this to align top.
#         layout.setAlignment(info, Qt.AlignTop)

        # Create a progress bar layout.
        button = QPushButton('Button 1')        
        layout.addWidget(button)        

        # This will align all the widgets to the top except
        # for the QTextBrowser() since it has a maximum size set.
        layout.setAlignment(Qt.AlignTop)

        self.setLayout(layout)


if __== '__main__':

    import sys

    app = QApplication(sys.argv)

    widget = MyWidget()
    widget.show()
    widget.resize(QSize(900, 400))

    app.exec_()

Ce qui suit appelle explicitement layout.setAlignment(info, Qt.AlignTop) pour faire fonctionner le widget de texte expansif.

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyWidget(QWidget):
    """
    Create a widget that aligns its contents to the top.
    """

    def __init__(self, parent=None):

        QWidget.__init__(self, parent)

        layout = QVBoxLayout()

        label = QLabel('label:')
        layout.addWidget(label)

        info = QTextBrowser(self)
        info.setMinimumHeight(100)
        info.setMaximumHeight(200)
        layout.addWidget(info)        
        # Uncomment the next line to get this to align top.
        layout.setAlignment(info, Qt.AlignTop)

        # Create a progress bar layout.
        button = QPushButton('Button 1')        
        layout.addWidget(button)        

        # This will align all the widgets to the top except
        # for the QTextBrowser() since it has a maximum size set.
        layout.setAlignment(Qt.AlignTop)

        self.setLayout(layout)


if __== '__main__':

    import sys

    app = QApplication(sys.argv)

    widget = MyWidget()
    widget.show()
    widget.resize(QSize(900, 400))

    app.exec_()
21
noisygecko

Si vous avez un QVBoxLayout et que vous voulez que vos widgets de taille fixe soient empilés en haut, vous pouvez simplement ajouter un étirement vertical et ajouter la fin:

layout.addStretch()

Si vous disposez de plusieurs stretchers ou d'autres éléments stretch, vous pouvez spécifier un argument de facteur d'étirement entier qui définit leur rapport de taille.

Voir aussi addStretch et addSpacerItem .

Je ne sais pas si cela répond à votre question d'origine, mais c'est la réponse à celle que j'ai eue lors de la recherche sur Google et d'être dirigé vers cette page - cela pourrait donc être utile pour d'autres aussi.

18
coldfix

Après comparaison entre les deux solutions, il semble que:

myLayout.setAlignment(Qt.AlignTop)

fonctionne pour l'alignement de plusieurs widgets mais:

myLayout.setAlignment(myWidget, Qt.AlignTop)

ne fonctionne que pour le premier widget que vous ajoutez à la mise en page. Après tout, la solution dépend également de la QSizePolicy de vos widgets.

8
Starfight