Как работает addStretch в QBoxLayout?

Я делаю учебник PyQt4 о макетах ящиков. Но я не понимаю, как работает addStretch.

  • Если я использую vbox.addStretch(1) и hbox.addStretch(1), две кнопки отображаются вниз-вправо. Зачем?
  • Если я комментирую vbox.addStretch(1) и hbox.addStretch(1), две кнопки отображаются в центре моего окна, и они деформируются по горизонтали, но не по вертикали. Зачем?
  • Разница не меняется, если я изменяю значение "1"... так что делает значение?

Ниже приведен код, который я использую:

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

Ответ 1

Метод addStretch добавляет QSpacerItem в конец макета блока. QSpacerItem - это настраиваемое пустое пространство.

  1. Использование vbox.addStretch(1) добавит элемент распорки нулевой ширины, который расширяется вертикально от вершины макета вниз.

    Использование hbox.addStretch(1) добавит элемент распорки нулевой высоты, который расширяется по горизонтали слева от макета вправо.

  2. Без растяжения макет будет определяться размеромPolicy виджетов. Для QPushButton это QSizePolicy.Fixed для вертикального измерения и QSizePolicy.Minimum для горизонтального измерения. Если вы хотите, чтобы кнопки расширялись в обоих направлениях, вы можете сделать что-то вроде этого:

        ok.setSizePolicy(QtGui.QSizePolicy.Minimum,
                         QtGui.QSizePolicy.Minimum)
        cancel.setSizePolicy(QtGui.QSizePolicy.Minimum,
                             QtGui.QSizePolicy.Minimum)
    
  3. Аргумент, передаваемый addStretch, изменяет коэффициент растяжения. Если вы добавите второе растяжение после кнопки ОК:

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

    вы увидите, что второй элемент распорки растет в два раза быстрее, чем первый. И если вы установите первое растяжение на ноль, оно не будет расти вообще.

Если вам нужна дополнительная информация, смотрите статью Управление раскладкой в документации Qt. Также было бы неплохо использовать Qt Designer для экспериментов с подобными вещами, так как он дает вам немедленную визуальную обратную связь и показывает все значения по умолчанию для различных задействованных свойств.