Qt 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

是否可以根据其内容调整QListWidget的高度和宽度

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.2
sizeHintForColumn(0)
返回与
sizeHint().width()
相同的数字,而且它非常必要。在Qt5.8中不适用于我,我改为使用此代码,它工作得非常好:/*使选择不跨越视图的整个宽度*/QListView{显示所选装饰:0;}//(index.row()*2调整宽度和高度以获得正确的总体尺寸。@Ekhumro非常感谢您的帮助。我在回答中包括了它。不确定早期版本,但是Qt 5.12没有将项目间距添加到sizeHint值中,因此可能需要为列表中的每个项目添加2倍间距值。