QListWidget将大小调整为内容

时间:2011-06-13 23:34:03

标签: qt pyqt

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

无论内容是什么,

sizeHint()始终会返回256, 192 QListWidgetItem的{​​{1}}返回sizeHint(),因此我无法获得内容宽度。

问题与此处相同 - http://www.qtcentre.org/threads/31787-QListWidget-width,但没有解决方案。

enter image description here

-1, -1

6 个答案:

答案 0 :(得分:43)

  

sizeHint()始终返回256,192 no   重要的是它的内容。

多数民众赞成因为这是QListWidget,视口的大小,而不是项目。 sizeHintForColumn()会为您提供所有项目的最大尺寸,因此您可以像这样调整窗口小部件的大小:

list.setMinimumWidth(list.sizeHintForColumn(0))

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

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

答案 1 :(得分:8)

使用takois answer我使用sizeHintForColumnsizeHintForRow玩了一下,发现你必须添加稍大一些的数字,因为可能还有一些依赖于样式的边距。然后,ekhumoros comment让我走上正轨。

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

list.sizeHintForColumn(0) + 2 * list.frameWidth()
list.sizeHintForRow(0) * list.count() + 2 * list.frameWidth())

根据Violet的comment,它可能在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_()

答案 2 :(得分:2)

为了有效地使用sizeHint,你必须覆盖它,至少在c ++中。根据我的经验,当您需要特定的行为时,窗口小部件的默认实现可能毫无用处。尝试用间隔器或布局强制你想要的东西在灾难中结束。如果你可以从QListWidget派生并覆盖sizeHint,你可以遍历你的项目并找到最长的字符串,然后做一些魔法来确定它应该有多宽。

无论如何,这就是我要做的事。

答案 3 :(得分:-1)

首先,你应该在列表中获得最大的字符串,这很容易获得。

获得该字符串后,请执行以下操作:

QFontMetrics * fm = new QFontMetrics(widget->font());
QRect rect;
rect = fm->boundingRect(string);

rect.width()具有最大字符串的宽度(以像素为单位) rect.height()有它的高度。

将QListWidget宽度设置为该rect的宽度(加上边距) 并且它的高度是该矩形的高度乘以项目数

我没有测试代码,但希望它能让你走上正确的轨道

答案 4 :(得分:-1)

QListWidget *valList;

valList =  new QListWidget(this);

valList->setSizePolicy (QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored));
valList->setMinimumSize (QSize(1111, 111));

答案 5 :(得分:-2)

您需要获取QListWidget的QHeaderView并调整其调整大小模式。

阅读此文档以获取更多信息

http://doc.qt.nokia.com/latest/qheaderview.html#ResizeMode-enum