QListWidget将大小调整为内容

Qia*_*iao 35 qt pyqt

是否可以将QListWidget的高度和宽度调整为其内容?

sizeHint()256, 192无论内容是什么,总是返回.
QListWidgetItemsizeHint()回报-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_())
Run Code Online (Sandbox Code Playgroud)

gwo*_*pq9 46

无论内容是什么,sizeHint()总是返回256,192.

那是因为这是QListWidget的大小,视口,而不是项目.sizeHintForColumn()将为您提供所有项目的最大大小,因此您可以像这样调整窗口小部件的大小:

list.setMinimumWidth(list.sizeHintForColumn(0))
Run Code Online (Sandbox Code Playgroud)

如果您不想强制最小宽度,则子类并将其作为大小提示来提供.例如:

class ListWidget(QListWidget):
  def sizeHint(self):
    s = QSize()
    s.setHeight(super(ListWidget,self).sizeHint().height())
    s.setWidth(self.sizeHintForColumn(0))
    return s
Run Code Online (Sandbox Code Playgroud)

  • 签出QAbstractScrollArea (2认同)

Tri*_*ion 8

使用takois 回答我玩了sizeHintForColumn或者sizeHintForRow发现你必须添加稍大一些的数字,因为可能还有一些依赖于样式的边距.ekhumoros 评论然后把我放在正确的轨道上.

简而言之,列表小部件的完整大小是:

list.sizeHintForColumn(0) + 2 * list.frameWidth()
list.sizeHintForRow(0) * list.count() + 2 * list.frameWidth())
Run Code Online (Sandbox Code Playgroud)

根据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_()
Run Code Online (Sandbox Code Playgroud)

  • 您只需要在宽度和高度上添加 `list.frameWidth() * 2` 以获得正确的整体尺寸。 (3认同)