¿Cómo funciona exactamente addStretch en QBoxLayout?

Estoy haciendo un tutorial de PyQt4 sobre diseños de cajas. Pero no entiendo cómo funciona addStretch .

  • Si uso vbox.addStretch(1) y hbox.addStretch(1) , los dos botones aparecen abajo a la derecha. ¿Por qué?
  • Si comento vbox.addStretch(1) y hbox.addStretch(1) , los dos botones aparecen en el centro de mi ventana y son deformables horizontalmente, pero no verticalmente. ¿Por qué?
  • no hay diferencia si cambio el valor “1” … entonces, ¿qué hace el valor?

A continuación se muestra el código que estoy usando:

 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_()) 

El método addStretch agrega un QSpacerItem al final de un diseño de cuadro. Un QSpacerItem es un espacio en blanco ajustable.

  1. El uso de vbox.addStretch(1) agregará un elemento espaciador de ancho cero que se expande verticalmente desde la parte superior del diseño hacia abajo.

    El uso de hbox.addStretch(1) agregará un elemento espaciador de altura cero que se expande horizontalmente desde la izquierda del diseño hacia la derecha.

  2. Sin estiramiento, el diseño estará determinado por la política de tamaño de los widgets. Para un QPushButton, este es QSizePolicy.Fixed para la dimensión vertical, y QSizePolicy.Minimum para la dimensión horizontal. Si quisiera que los botones se expandieran en ambas direcciones, podría hacer algo como esto:

      ok.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) cancel.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) 
  3. El argumento pasado a addStretch cambia el factor de estiramiento. Si agrega un segundo tramo después del botón Aceptar:

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

    Verás que el segundo elemento espaciador crece dos veces más rápido que el primero. Y si establece el primer estiramiento a cero, no crecerá en absoluto.

Si desea más información, consulte el artículo de gestión de diseño en los documentos de Qt. También es una buena idea usar Qt Designer para experimentar con cosas como esta, ya que te brinda una retroalimentación visual inmediata y te muestra todos los valores predeterminados de las distintas propiedades involucradas.