Je fais un tutoriel PyQt4 sur les dispositions de boîte. Mais je ne comprends pas comment addStretch
fonctionne.
vbox.addStretch(1)
et hbox.addStretch(1)
, les deux boutons apparaissent en bas à droite. Pourquoi?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?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_())
La méthode addStretch ajoute un QSpacerItem à la fin d'une disposition de boîte. Un QSpacerItem est un espace vide réglable.
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.
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)
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.