web-dev-qa-db-ja.com

QVBoxLayout:ウィジェットを中央ではなく上部に垂直に配置する方法

Qtでは、レイアウトにウィジェットを追加すると、デフォルトで垂直方向に中央揃えになります。ウィジェットを垂直方向に中央揃えするのではなく、上から下に「リスト」する方法はありますか?

40
sFuller

void QLayout::setAlignment ( Qt::Alignment alignment )メソッドを使用して、選択に応じて配置を設定します。

38
Kunal

これは、layout.setAlignment()を使用するよりも少し複雑です。最大の高さを設定するエキスパンドウィジェットがある場合、そのウィジェットは望みどおりに配置されないことがわかりました。

以下は、QTextBrowser()を呼び出してもnotlayout.setAlignment(Qt.AlignTop)ウィジェットを上揃えにするサンプルコードです。 Pythonであることを申し訳ありませんが、C++に翻訳するのは非常に簡単です(私は何度も逆に行っています)。

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyWidget(QWidget):
    """
    Create a widget that aligns its contents to the top.
    """

    def __init__(self, parent=None):

        QWidget.__init__(self, parent)

        layout = QVBoxLayout()

        label = QLabel('label:')
        layout.addWidget(label)

        info = QTextBrowser(self)
        info.setMinimumHeight(100)
        info.setMaximumHeight(200)
        layout.addWidget(info)        
        # Uncomment the next line to get this to align top.
#         layout.setAlignment(info, Qt.AlignTop)

        # Create a progress bar layout.
        button = QPushButton('Button 1')        
        layout.addWidget(button)        

        # This will align all the widgets to the top except
        # for the QTextBrowser() since it has a maximum size set.
        layout.setAlignment(Qt.AlignTop)

        self.setLayout(layout)


if __== '__main__':

    import sys

    app = QApplication(sys.argv)

    widget = MyWidget()
    widget.show()
    widget.resize(QSize(900, 400))

    app.exec_()

以下は、layout.setAlignment(info, Qt.AlignTop)を明示的に呼び出して、使用するテキストウィジェットを機能させます。

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class MyWidget(QWidget):
    """
    Create a widget that aligns its contents to the top.
    """

    def __init__(self, parent=None):

        QWidget.__init__(self, parent)

        layout = QVBoxLayout()

        label = QLabel('label:')
        layout.addWidget(label)

        info = QTextBrowser(self)
        info.setMinimumHeight(100)
        info.setMaximumHeight(200)
        layout.addWidget(info)        
        # Uncomment the next line to get this to align top.
        layout.setAlignment(info, Qt.AlignTop)

        # Create a progress bar layout.
        button = QPushButton('Button 1')        
        layout.addWidget(button)        

        # This will align all the widgets to the top except
        # for the QTextBrowser() since it has a maximum size set.
        layout.setAlignment(Qt.AlignTop)

        self.setLayout(layout)


if __== '__main__':

    import sys

    app = QApplication(sys.argv)

    widget = MyWidget()
    widget.show()
    widget.resize(QSize(900, 400))

    app.exec_()
21
noisygecko

QVBoxLayoutがあり、固定サイズのウィジェットを上部に積み重ねる場合は、垂直方向のストレッチを追加して最後に追加するだけです。

layout.addStretch()

複数のストレッチャーまたは他のストレッチアイテムがある場合、サイズ比を定義する整数ストレッチファクター引数を指定できます。

addStretch および addSpacerItem も参照してください。

これがあなたの元の質問に答えているかどうかはわかりませんが、それはグーグルでこのページに導かれたときに私が持っていたものに対する答えです。

18
coldfix

2つのソリューションを比較すると、次のように思われます。

myLayout.setAlignment(Qt.AlignTop)

いくつかのウィジェットの調整には機能しますが、

myLayout.setAlignment(myWidget, Qt.AlignTop)

レイアウトに追加する最初のウィジェットに対してのみ機能します。結局のところ、ソリューションはウィジェットのQSizePolicyにも依存します。

8
Starfight