Qt では、ウィジェットをレイアウトに追加すると、デフォルトで垂直方向の中央に配置されます。ウィジェットを垂直方向に中央揃えするのではなく、上から下に「リスト」する方法はありますか?
5 に答える
メソッドを使用void QLayout::setAlignment ( Qt::Alignment alignment )
して、選択に従って配置を設定します。
QVBoxLayout
があり、固定サイズのウィジェットを上部に積み重ねたい場合は、最後に垂直方向のストレッチを追加するだけです。
layout.addStretch()
複数のストレッチャーまたはその他のストレッチ アイテムがある場合は、サイズの比率を定義する整数ストレッチ ファクター引数を指定できます。
addStretchおよびaddSpacerItemも参照してください。
layout.addStretch()
ウィジェットを追加する前後に 2 つ追加して、ウィジェットを垂直方向に中央揃えにします。
layout.addStretch()
layout.addWidget(self.message)
layout.addWidget(self.userid_field)
layout.addWidget(self.password_field)
layout.addWidget(self.loginButton)
layout.addStretch()
これがあなたの元の質問に答えるかどうかはわかりませんが、グーグルでこのページに誘導されたときに私が持っていたものに対する答えであるため、他の人にも役立つかもしれません.
これは、単に使用するよりも少し複雑だと思いますlayout.setAlignment()
。最大の高さを設定した拡張ウィジェットがある場合、そのウィジェットは希望どおりに配置されないことがわかりました。
を呼び出してもウィジェットを上揃えしないコード例を次に示します。Python で書かれているのは残念ですが、C++ に変換するのはかなり簡単です (私は何度も別の方法で行ってきました)。QTextBrowser()
layout.setAlignment(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 __name__ == '__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 __name__ == '__main__':
import sys
app = QApplication(sys.argv)
widget = MyWidget()
widget.show()
widget.resize(QSize(900, 400))
app.exec_()
2 つのソリューションを比較すると、次のようになります。
myLayout.setAlignment(Qt.AlignTop)
いくつかのウィジェットの配置で機能しますが、次のとおりです。
myLayout.setAlignment(myWidget, Qt.AlignTop)
レイアウトに追加する最初のウィジェットに対してのみ機能します。結局のところ、ソリューションはウィジェットの QSizePolicy にも依存します。