是否可以将QListWidget的高度和宽度调整为其内容?
无论内容是什么, sizeHint()
始终会返回256, 192
QListWidgetItem
的{{1}}返回sizeHint()
,因此我无法获得内容宽度。
问题与此处相同 - http://www.qtcentre.org/threads/31787-QListWidget-width,但没有解决方案。
-1, -1
答案 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我使用sizeHintForColumn
或sizeHintForRow
玩了一下,发现你必须添加稍大一些的数字,因为可能还有一些依赖于样式的边距。然后,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