web-dev-qa-db-fra.com

Comment fonctionne exactement addStretch dans QBoxLayout?

Je fais un tutoriel PyQt4 sur les dispositions de boîte. Mais je ne comprends pas comment addStretch fonctionne.

  • Si j'utilise vbox.addStretch(1) et hbox.addStretch(1), les deux boutons apparaissent en bas à droite. Pourquoi?
  • si je commente vbox.addStretch(1) et hbox.addStretch(1) out, les deux boutons apparaissent au centre de ma fenêtre, et ils sont déformables horizontalement, mais pas verticalement. Pourquoi?
  • il n'y a aucune différence si je change la valeur "1" ... alors que fait la valeur?

Voici le code que j'utilise:

import sys
from PyQt4 import QtGui

class BoxLayout(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setWindowTitle('box layout')

        ok = QtGui.QPushButton("OK")
        cancel = QtGui.QPushButton("Cancel")

        vbox = QtGui.QHBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(ok)
        vbox.addWidget(cancel)

        hbox = QtGui.QVBoxLayout()
        hbox.addStretch(1)
        hbox.addLayout(vbox)

        self.setLayout(hbox)

        self.resize(100, 100)

app = QtGui.QApplication(sys.argv)
qb = BoxLayout()
qb.show()
sys.exit(app.exec_())
21
Hubschr

La méthode addStretch ajoute un QSpacerItem à la fin d'une disposition de boîte. Un QSpacerItem est un espace vide réglable.

  1. L'utilisation de vbox.addStretch(1) ajoutera un élément d'espacement de largeur nulle qui se développe verticalement du haut de la mise en page vers le bas.

    L'utilisation de hbox.addStretch(1) ajoutera un élément d'espacement de hauteur nulle qui se développe horizontalement de la gauche de la disposition vers la droite.

  2. Sans étirement, la disposition sera déterminée par sizePolicy des widgets. Pour un QPushButton, il s'agit de QSizePolicy.Fixed pour la dimension verticale et QSizePolicy.Minimum pour la dimension horizontale. Si vous vouliez que les boutons se développent dans les deux directions, vous pourriez faire quelque chose comme ceci:

        ok.setSizePolicy(QtGui.QSizePolicy.Minimum,
                         QtGui.QSizePolicy.Minimum)
        cancel.setSizePolicy(QtGui.QSizePolicy.Minimum,
                             QtGui.QSizePolicy.Minimum)
    
  3. L'argument passé à addStretch modifie le facteur d'étirement. Si vous ajoutez un deuxième tronçon après le bouton ok:

        vbox = QtGui.QHBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(ok)
        vbox.addStretch(2)
        vbox.addWidget(cancel)
    

    vous verrez que le deuxième élément d'espacement croît deux fois plus vite que le premier. Et si vous définissez le premier tronçon à zéro, il ne se développera pas du tout.

Si vous souhaitez plus d'informations, consultez l'article Layout Management dans la documentation Qt. C'est aussi une bonne idée d'utiliser Qt Designer pour expérimenter des trucs comme celui-ci, car il vous donne un retour visuel immédiat et vous montre toutes les valeurs par défaut des différentes propriétés impliquées.

32
ekhumoro