2011-06-13 201 views
28

是否可以调整QListWidget的高度和宽度到它的内容?QListWidget调整大小到内容

sizeHint()总是返回256, 192不管它的内容是什么。
QListWidgetItemsizeHint()返回-1, -1,所以我无法获得内容宽度。

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

enter image description here

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_()) 

回答

37

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 
+0

它的工作原理。只需要添加+5像素,所以没有滚动条。我在哪里可以阅读有关视口?找不到。 – Qiao 2011-06-16 16:40:29

+1

检出QAbstractScrollArea – takoi 2011-06-16 16:55:38

+1

如果将有一个垂直滚动条,在将ListWidget插入到所需布局中后,使用以下两行:'list_widget.updateGeometry()',然后添加'list_widget.verticalScrollBar()。width()' – Jeff 2014-03-03 15:38:14

-2

你需要让你的QListWidget的QHeaderView并调整其调整模式。

阅读本文档的详细信息

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

+0

和我在哪里可以阅读有关让你QListWidget的QHeaderView?无法在列表文档及其父类中找到关于标题的提及。 – Qiao 2011-06-15 00:28:46

+0

好吧忘了QHeaderView。设置尺寸策略后,尝试将调整大小模式设置为调整[doc](http://doc.qt.nokia.com/latest/qlistview.html#ResizeMode-enum) – emaillenin 2011-06-15 02:54:51

+0

它不起作用。 'sizeHint()'总是返回256,192,size策略不能改变它。 – Qiao 2011-06-15 23:16:21

2

为了有效地使用sizeHint,你必须覆盖它,至少在C++中。根据我的经验,当你想要一个特定的行为时,widget的默认实现可能是无用的。试图用间隔符或布局迫使你想要的东西在灾难中结束。如果你可以从QListWidget派生并覆盖sizeHint,你可以迭代你的项目并找到最长的字符串,然后做一些魔术来确定它应该有多宽。

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

-1

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

之后你得到的字符串,请执行下列操作:

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

rect.width()拥有最大的字符串 rect.height的像素宽度()有它的高度。

设置QListWidget宽度是矩形的宽度(加上利润) ,它的高度是矩形的高度次项目

我没有测试代码的数量,但希望它让你在右边跟踪

-1
QListWidget *valList; 

valList = new QListWidget(this); 

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

使用takois answer我与sizeHintForColumnsizeHintForRow发挥四周,发现你必须添加稍大的数字,因为可能有一些风格依赖利润率依然。 ekhumoros comment然后把我放在正确的轨道上。

在列表部件的短全尺寸是:

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

按照comment由紫它可能不会使用Qt工作5

另外要注意的是,大小设置为内容,你不需要滚动条,所以我把它们关掉。

我对ajusted其内容大小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_() 
+0

如果有人发现缺失边缘的更好表达式,请在此处评论。 – Trilarion 2015-01-07 22:49:10

+1

您只需要将'list.frameWidth()* 2'添加到宽度和高度以获得正确的整体大小。 – ekhumoro 2015-01-08 00:45:02

+0

@ekhumoro非常感谢您的帮助。我把它列入答案。 – Trilarion 2015-01-08 08:56:38