Qt QListWidget根据内容调整大小
是否可以根据其内容调整QListWidget的高度和宽度Qt QListWidget根据内容调整大小,qt,pyqt,Qt,Pyqt,是否可以根据其内容调整QListWidget的高度和宽度 sizeHint()始终返回256192,无论其内容是什么。 QListWidgetItem的sizeHint()返回-1,-1,因此无法获取内容宽度 问题与此处相同,但没有解决方案 import sys from PyQt4.QtGui import * class MainWindow(QWidget): def __init__(self, parent=None): QWidget.__init__(se
sizeHint()
始终返回256192
,无论其内容是什么。QListWidgetItem
的sizeHint()
返回-1,-1
,因此无法获取内容宽度
问题与此处相同,但没有解决方案
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_())
您需要获取QListWidget的QHeaderView并调整其大小调整模式 有关更多信息,请阅读本文档 sizeHint()始终返回256192否 不管它的内容是什么 这是因为这是QListWidget、视口的大小,而不是项目的大小。将为您提供所有项目的最大大小,因此您可以按如下方式调整小部件的大小:
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
<>为了有效地使用siZeNoT,必须至少在C++中重写它。根据我的经验,当您需要特定的行为时,小部件的默认实现可能非常无用。试图用间隔符或布局强制实现您想要的结果会导致灾难。如果您可以从QListWidget派生并覆盖sizeHint,那么您可以遍历您的项并找到最长的字符串,然后做一些魔术来确定它应该有多宽
无论如何,这就是我要做的。首先,您应该获得列表中最大的字符串,这很容易获得 获取该字符串后,请执行以下操作:
QFontMetrics * fm = new QFontMetrics(widget->font());
QRect rect;
rect = fm->boundingRect(string);
width()具有最大字符串的宽度(以像素为单位)
rect.height()具有它的高度
将QListWidget宽度设置为该矩形的宽度(加上边距)
它的高度等于矩形的高度乘以项目数
我没有测试代码,但希望它能让您走上正轨,使用takois,我在sizeHintForColumn
或sizeHintForRow
中使用了takois,发现您必须添加稍大的数字,因为可能仍然存在一些与样式相关的边距。Ekhuromos让我走上了正确的道路
QListWidget *valList;
valList = new QListWidget(this);
valList->setSizePolicy (QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored));
valList->setMinimumSize (QSize(1111, 111));
简而言之,列表小部件的完整大小为:
list.sizeHintForColumn(0) + 2 * list.frameWidth()
list.sizeHintForRow(0) * list.count() + 2 * list.frameWidth())
根据Violet提供的信息,它在Qt 5中可能不起作用
还要注意,设置内容的大小时,不需要滚动条,因此我将其关闭
我的QListWidget
a调整为其内容大小的完整示例:
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_()
我在哪里可以看到关于获取QListWidget的QHeaderView的信息?在列表的文档及其父类中找不到关于标题的内容。好的,忘记QHeaderView吧。设置大小策略后,请尝试设置调整大小模式以调整它不起作用
sizeHint()
始终返回256192,大小策略无法更改它。它可以工作。只需要添加+5像素,这样就没有滚动条了。在哪里可以阅读有关视口的信息?找不到它。请检查QAbstractScrollArea如果将有一个垂直滚动条,请在所需布局中插入ListWidget后使用以下两行:list\u widget.updateGeometry()
,然后添加list\u widget.verticalScrollBar().width()
不适用于Qt 5.2sizeHintForColumn(0)
返回与sizeHint().width()
相同的数字,而且它非常必要。在Qt5.8中不适用于我,我改为使用此代码,它工作得非常好:/*使选择不跨越视图的整个宽度*/QListView{显示所选装饰:0;}//(index.row()*2调整宽度和高度以获得正确的总体尺寸。@Ekhumro非常感谢您的帮助。我在回答中包括了它。不确定早期版本,但是Qt 5.12没有将项目间距添加到sizeHint值中,因此可能需要为列表中的每个项目添加2倍间距值。