web-dev-qa-db-ja.com

QListWidgetはコンテンツに合わせてサイズを調整します

QListWidgetの高さと幅をコンテンツに合わせて調整することは可能ですか?

sizeHint()は、その内容に関係なく、常に_256, 192_を返します。
QListWidgetItemsizeHint()は_-1, -1_を返すため、コンテンツの幅を取得できません。

ここと同じ問題- http://www.qtcentre.org/threads/31787-QListWidget-width ですが、解決策はありません。

enter image description here

_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_())
_
34
Qiao

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
45
gwohpq9

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_()
8
Trilarion

SizeHintを効果的に使用するには、少なくともc ++でオーバーライドする必要があります。私の経験では、特定の動作が必要な場合、ウィジェットのデフォルトの実装はほとんど役に立たない可能性があります。スペーサーまたはレイアウトで必要なものを強制しようとすると、惨事に終わります。 QListWidgetから派生し、sizeHintをオーバーライドできる場合は、アイテムを反復処理して最長の文字列を見つけ、何らかのマジックを実行して幅を決定できます。

とにかくそれは私がやることだ。

2
Thadeux