web-dev-qa-db-ja.com

QBoxLayoutでaddStretchはどのように機能しますか?

私はボックスのレイアウトについてPyQt4チュートリアルをやっています。しかし、addStretchの仕組みがわかりません。

  • vbox.addStretch(1)hbox.addStretch(1)を使用すると、2つのボタンが右下に表示されます。どうして?
  • vbox.addStretch(1)hbox.addStretch(1)をコメントアウトすると、2つのボタンがウィンドウの中央に表示され、水平方向に変形できますが、垂直方向には変形できません。どうして?
  • 値「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_())
21
Hubschr

addStretch メソッドは、ボックスレイアウトの最後に QSpacerItem を追加します。 QSpacerItemは調整可能な空白スペースです。

  1. vbox.addStretch(1)を使用すると、レイアウトの上から下に垂直方向に拡張するゼロ幅のスペーサーアイテムが追加されます。

    hbox.addStretch(1)を使用すると、高さゼロのスペーサー項目が追加され、レイアウトの左から右方向に水平方向に拡張されます。

  2. ストレッチしない場合、レイアウトはウィジェットの sizePolicy によって決定されます。 QPushButtonの場合、これは垂直次元の場合は QSizePolicy.Fixed 、水平次元の場合は QSizePolicy.Minimum です。ボタンを両方向に拡張したい場合は、次のようにすることができます。

        ok.setSizePolicy(QtGui.QSizePolicy.Minimum,
                         QtGui.QSizePolicy.Minimum)
        cancel.setSizePolicy(QtGui.QSizePolicy.Minimum,
                             QtGui.QSizePolicy.Minimum)
    
  3. AddStretchに渡される引数は、ストレッチファクターを変更します。 [OK]ボタンの後に2番目のストレッチを追加する場合:

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

    2番目のスペーサーアイテムが最初のスペーサーアイテムの2倍の速度で成長することがわかります。また、最初のストレッチをゼロに設定しても、まったく伸びません。

詳細については、Qtドキュメントの Layout Management の記事を参照してください。 Qt Designer を使用して、このようなものを実験することもお勧めです。これにより、即座に視覚的なフィードバックが得られ、関連するさまざまなプロパティのすべてのデフォルト値が表示されます。

32
ekhumoro