QListWidgetの高さと幅をコンテンツに合わせて調整することは可能ですか?
sizeHint()
は、その内容に関係なく、常に_256, 192
_を返します。QListWidgetItem
のsizeHint()
は_-1, -1
_を返すため、コンテンツの幅を取得できません。
ここと同じ問題- http://www.qtcentre.org/threads/31787-QListWidget-width ですが、解決策はありません。
_import sys
from PyQt4.QtGui import *
class MainWindow(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
list = QListWidget()
list.addItem('111111111111111')
vbox = QVBoxLayout(self)
vbox.addWidget(list)
app = QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())
_
sizeHint()は、その内容が何であれ、常に256、192を返します。
これは、これがアイテムではなく、QListWidget、ビューポートのサイズだからです。 sizeHintForColumn() は、すべてのアイテムの最大サイズを提供するため、次のようにウィジェットのサイズを変更できます。
list.setMinimumWidth(list.sizeHintForColumn(0))
最小幅を強制したくない場合は、サブクラス化し、代わりにこれをサイズのヒントとして提供します。例えば。:
class ListWidget(QListWidget):
def sizeHint(self):
s = QSize()
s.setHeight(super(ListWidget,self).sizeHint().height())
s.setWidth(self.sizeHintForColumn(0))
return s
Takoisの使用 answersizeHintForColumn
またはsizeHintForRow
をいじってみたところ、スタイルに依存する余白があるため、少し大きい数字を追加する必要があることがわかりました。 ekhumoros コメント その後、私を正しい方向に導きます。
要するに、リストウィジェットのフルサイズは次のとおりです。
list.sizeHintForColumn(0) + 2 * list.frameWidth()
list.sizeHintForRow(0) * list.count() + 2 * list.frameWidth())
Violetによる コメント によると、Qt 5では動作しない可能性があります。
また、コンテンツのサイズを設定すると、スクロールバーは必要ないので、それらをオフにします。
コンテンツサイズに調整されたQListWidget
の私の完全な例:
from PySide import QtGui, QtCore
app = QtGui.QApplication([])
window = QtGui.QWidget()
layout = QtGui.QVBoxLayout(window)
list = QtGui.QListWidget()
list.addItems(['Winnie Puh', 'Monday', 'Tuesday', 'Minnesota', 'Dracula Calista Flockhart Meningitis', 'Once', '123345', 'Fin'])
list.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
list.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
list.setFixedSize(list.sizeHintForColumn(0) + 2 * list.frameWidth(), list.sizeHintForRow(0) * list.count() + 2 * list.frameWidth())
layout.addWidget(list)
window.show()
app.exec_()
SizeHintを効果的に使用するには、少なくともc ++でオーバーライドする必要があります。私の経験では、特定の動作が必要な場合、ウィジェットのデフォルトの実装はほとんど役に立たない可能性があります。スペーサーまたはレイアウトで必要なものを強制しようとすると、惨事に終わります。 QListWidgetから派生し、sizeHintをオーバーライドできる場合は、アイテムを反復処理して最長の文字列を見つけ、何らかのマジックを実行して幅を決定できます。
とにかくそれは私がやることだ。