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

Я делаю PyQt4 учебник о макетах коробки. Но я не понимаю как!--1--> строительство.

  • если я использую vbox.addStretch(1) и hbox.addStretch(1), две кнопки появляются вниз-вправо. Почему?
  • если я комментарий vbox.addStretch(1) и hbox.addStretch(1) out, две кнопки появляются в центре моего окна, и они деформируются горизонтально, но не вертикально. Почему?
  • нет никакой разницы, если я изменю значение "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. без растяжки, макет будет определяться sizePolicy виджетов. Для QPushButton это QSizePolicy.Исправлено для вертикального измерения, и QSizePolicy.Минимум для горизонтального измерения. Если вы хотите, чтобы кнопки расширялись в в обоих направлениях вы можете сделать что-то вроде этого:

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

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

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

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