質問
レイアウトに既にストレッチ コンポーネントが含まれている場合でも、最小の高さを持ち、使用可能なすべてのスペースを埋めるためにストレッチする QListWidget を作成するにはどうすればよいですか?
バックグラウンド
私は PySide を使用して動的なユーザー インターフェイスを作成しています。インターフェイスのコンポーネントは、コンテキストに応じて変化します。私の目標は、次のような垂直レイアウトにすることです。
コントロール(ラベル付きのグリッド レイアウト)
ストレッチ
ボタン(主な操作ボタン)
ステータスバー
ボタンとステータス バーは単なる QHBoxLayouts です。QMainWindow の代わりに QDialog を使用しています。これは、Maya や Nuke などの別のアプリケーション内でよく使用されるためです。ダイアログはオンザフライで構築され、ダイアログが表示された後に QListWidget を追加できる場合があります。addStretch をいつ追加し、いつ追加しないかを予測することはできません。
試練
これらのコードの一部を使用してみましたが、役に立ちませんでした。
# Set the size Policy.
listWidget.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
# Set a minimum Height
count = min(listBox.count(),12)
bestHeight = count*listBox.sizeHintForRow(0)+5
listBox.setMinimumHeight(bestHeight)
setMinimumHeight() と setSizeHint() を使用して、QListWidget をサブクラス化して sizeHint 関数を制御しようとさえしました。* QListWidgetItem の最小の高さを設定するには? * QListWidget はコンテンツに合わせてサイズを調整します
例
これは完全な例です。QListWidget は、高さを埋めるために伸びていません。addStretch() 行を削除すると、QListWidget は希望どおりに動作しますが、これを動的にしたいのです。
#!/usr/bin/env python
import sys
from PySide import QtCore, QtGui
class myDialog(QtGui.QDialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setWindowTitle("Testing 123")
# Declare Layouts.
self.mainLayout=QtGui.QVBoxLayout()
self.gridLayout=QtGui.QGridLayout()
self.buttons = QtGui.QHBoxLayout()
self.statusBarLayout = QtGui.QHBoxLayout()
# Set margins.
self.mainLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setContentsMargins(4, 4, 4, 4)
self.buttons.setContentsMargins(0, 0, 0, 0)
self.statusBarLayout.setContentsMargins(0, 0, 0, 0)
# Assemble Layouts.
self.mainLayout.addLayout(self.gridLayout)
self.mainLayout.addStretch()
self.mainLayout.addLayout(self.buttons)
self.mainLayout.addLayout(self.statusBarLayout)
self.setLayout(self.mainLayout)
# Fill in Grid Layout.
row = 0
self.gridLayout.addWidget(QtGui.QLabel("ComboBox"), row, 0)
combo = QtGui.QComboBox()
combo.addItems(['A','B','C','1','2','3'])
self.gridLayout.addWidget(combo, row, 1)
row += 1
self.gridLayout.addWidget(QtGui.QLabel("List"), row, 0)
listWidget = QtGui.QListWidget()
listWidget.addItems(['A','B','C','1','2','3'])
self.gridLayout.addWidget(listWidget, row, 1)
row += 1
self.gridLayout.addWidget(QtGui.QLabel("LineEdit"), row, 0)
self.gridLayout.addWidget(QtGui.QLineEdit(), row, 1)
row += 1
# Add some buttons.
for x in ['One','Two']:
self.buttons.addWidget(QtGui.QPushButton(x))
# Add the psuedo status bar.
self.statusBar = QtGui.QStatusBar()
self.statusBarLayout.addWidget(self.statusBar, 4 )
self.statusBar.showMessage("Hello World")
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
dialog = myDialog()
sys.exit(dialog.exec_())