【问题标题】:QListWidget adjust size to contentQListWidget 根据内容调整大小
【发布时间】:2011-09-14 07:41:52
【问题描述】:

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

sizeHint() 无论内容是什么,总是返回256, 192
QListWidgetItemsizeHint() 返回-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_())

【问题讨论】:

    标签: qt pyqt


    【解决方案1】:

    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
    

    【讨论】:

    • 它有效。只需要添加 +5 px 就没有滚动条了。我在哪里可以阅读有关视口的信息?找不到。
    • 查看 QAbstractScrollArea
    • 如果会有垂直滚动条,在需要的布局中插入ListWidget后,使用以下两行:list_widget.updateGeometry(),然后添加list_widget.verticalScrollBar().width()
    • 不适用于 Qt 5.2。 sizeHintForColumn(0) 返回与 sizeHint().width() 相同的数字,而且远远超过必要。
    • 在 qt 5.8 中不适合我,我改用此代码,它运行良好:/* 使选择不跨越视图的整个宽度 */ QListView { show-decoration-selected: 0; } // 并且对于选中: if(index.row()
    【解决方案2】:

    使用 takois answer 我玩弄了 sizeHintForColumnsizeHintForRow 并发现您必须添加稍大的数字,因为可能仍然存在一些与样式相关的边距。 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_()
    

    【讨论】:

    • 如果有人找到更好的表达缺失边距的方法,请在此处发表评论。
    • 您只需将list.frameWidth() * 2 添加到宽度和高度即可获得正确的整体尺寸。
    • @ekhumoro 非常感谢您的帮助。我将其包含在答案中。
    • 不确定早期版本,但是 Qt 5.12 不会将项目间距添加到 sizeHint 值中,因此可能需要为列表中的每个项目添加 2x 间距值。
    • 在 PyQt 5.15 中主要为我工作,但假设每一行具有相同的高度是不正确的。对我来说,中文字符的行高比只有英文字符的行高略大。
    【解决方案3】:

    为了有效地使用 sizeHint,您必须重写它,至少在 c++ 中是这样。以我的经验,当您需要特定行为时,小部件的默认实现可能毫无用处。试图用间隔或布局强制你想要的东西会以灾难告终。如果您可以从 QListWidget 派生并覆盖 sizeHint,则可以遍历您的项目并找到最长的字符串,然后使用某种魔法来确定它应该有多宽。

    反正我就是这么做的。

    【讨论】:

      【解决方案4】:

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

      获得该字符串后,执行以下操作:

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

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

      将 QListWidget 宽度设置为该矩形的宽度(加上边距) 它的高度是该矩形的高度乘以项目数

      我没有测试代码,但希望它能让你走上正轨

      【讨论】:

        【解决方案5】:
        QListWidget *valList;
        
        valList =  new QListWidget(this);
        
        valList->setSizePolicy (QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored));
        valList->setMinimumSize (QSize(1111, 111));
        

        【讨论】:

          【解决方案6】:

          您需要获取您的 QListWidget 的 QHeaderView 并调整其大小调整模式。

          阅读此文档了解更多信息

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

          【讨论】:

          • 我在哪里可以阅读有关获取 QListWidget 的 QHeaderView 的信息?在列表及其父类的文档中找不到关于标题的提及。
          • 好吧,忘记 QHeaderView。设置大小策略后,尝试将调整大小模式设置为调整doc
          • 它不起作用。 sizeHint() 总是返回 256, 192,size policy 无法更改。
          猜你喜欢
          • 2014-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-21
          • 2012-02-09
          • 2010-09-14
          • 2016-10-28
          相关资源
          最近更新 更多