问题描述
|
是否可以根据其内容调整QListWidget的高度和宽度?
content0ѭ始终返回
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答案,我在sizeHintForColumn
或sizeHintForRow
上玩耍,发现您必须添加稍大的数字,因为可能还会有一些与样式相关的边距。 ekhumoros发表评论,然后将我带入正确的轨道。
简而言之,列表小部件的完整大小为:
list.sizeHintForColumn(0) + 2 * list.frameWidth()
list.sizeHintForRow(0) * list.count() + 2 * list.frameWidth())
根据Violet的评论,它可能无法在Qt 5中使用。
另请注意,将大小设置为内容并不需要滚动条,因此我将其关闭。
我为ѭ11调整其内容大小的完整示例:
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,则可以遍历项目并找到最长的字符串,然后做一些魔术来确定其宽度。
无论如何,这就是我要做的。
, 首先,您应该在列表中获得最大的字符串,这很容易获得。
获得该字符串后,请执行以下操作:
QFontMetrics * fm = new QFontMetrics(widget->font());
QRect rect;
rect = fm->boundingRect(string);
rect.width()具有最大字符串的宽度(以像素为单位)
rect.height()具有它的高度。
将QListWidget宽度设置为该矩形的宽度(加上边距)
它的高度等于该矩形的高度乘以项目数
我没有测试代码,但希望它能使您走上正轨
, QListWidget *valList;
valList = new QListWidget(this);
valList->setSizePolicy (QSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored));
valList->setMinimumSize (QSize(1111,111));
, 您需要获取QListWidget的QHeaderView并调整其调整大小模式。
阅读此文档以获取更多信息
http://doc.qt.nokia.com/latest/qheaderview.html#ResizeMode-enum