【问题标题】:QListWidget that resizes instead of scrolls调整大小而不是滚动的 QListWidget
【发布时间】:2010-09-10 13:59:43
【问题描述】:

如何改变QListWidget 的行为,使其调整高度而不是选择(看似任意的)高度并添加滚动条?见截图:

QListView 应该在水平方向上填满尽可能多的空间(如果您愿意的话,可以创建尽可能多的“列”。)然后它们会根据需要包装并创建尽可能多的行以容纳所有项目。这些计算应在调整窗口大小时进行调整。这一切都很好。

但是,我想要发生的是,QListView 应该垂直增长或收缩,而不是高度保持不变,并且永远不需要任何滚动条。如有必要,滚动将在托管所有标签和列表的父 QWidget 上处理。似乎一旦建立了QListWidget 的高度(不确定它的默认值来自哪里),它就永远不会改变。在某些情况下它太大(参见上面的第二个“测试”列表)而在其他情况下太小(参见上面的第一个“空白地图”列表。)

上面的布局并不令人惊讶:两个QLabel 和两个QListWidget 在一个QVBoxLayout. 下面是我在QListWidget 上设置的属性:

setMovement(QListView::Static);
setResizeMode(QListView::Adjust);
setViewMode(QListView::IconMode);
setIconSize(QSize(128, 128));

(我已经尝试设置水平和垂直滚动条策略,但这只是关闭滚动条,剪切内容。不是我想要的。)

【问题讨论】:

    标签: c++ qt qlistview qlistwidget


    【解决方案1】:

    也许你可以不使用 QListWidget。 Qt 的示例包含一个新的布局类 QFlowLayout,它可能很有用。使用以下类型的小部件层次结构,您可以获得多个带有标签的组,它们都将位于一个 QScrollArea 内。

    QScrollBox
      QVBoxLayout
    
        QLabel "Blank maps"
        QWidget
           QFlowLayout
              your own widgets showing map images and labels
    
        QLabel "Text"
        QWidget
           QFlowLayout
              your own widgets
    

    问题是这种解决方案会比基于 QListWidget 的解决方案创建更多的小部件。因此,如果您的列表中有数百个项目,这可能不是最佳解决方案。

    【讨论】:

    • 好的,这非常非常接近。只要 QScrollBox 不在图片中,它就可以很好地工作。一旦我添加了它,QVBoxLayout 就会变得尽可能瘦,并且尽可能长。 (它返回的是 QSize(197, 942) 的 sizeHint。我已经尝试了我能想到的 QWidget::setSizePolicy 和 QLayout::setSizeConstraint 的所有组合,但没有什么能改变这种行为。秘诀是什么?
    • QScrollArea::setWidgetResizable() 为。这。 WIN!!!非常感谢你的帮助......我在 QListWidget 兔子小道上浪费了 2 天时间。
    【解决方案2】:

    QListView 中有一个名为contentsSize() 的受保护成员函数。它用于计算滚动条所需的minimum()maximum()pageStep()(如here 所述)。

    你能继承QListView 类并利用这些信息吗?我建议您在向其中添加内容的同一函数中重新计算小部件的大小。虽然有点缺乏优雅,但这似乎是一个非常可靠的解决方案。

    【讨论】:

    • 该属性看起来很有帮助,但我真的不知道如何使用它。有了这个大小,我可以在 QListWidget 上调用什么方法来强制它成为那个值? (或者改变sizeHint?)对不起,这里对Qt比较新,这对我来说很模糊。感谢您的帮助!
    • 可以将sizeHint设置为这个大小,将sizeHintPolicy设置为Fixed;或使用setGeometry() 方法。免责声明:我没有测试我在这里提出的建议,但我非常有信心它会奏效。
    • 我继承了QListWidget 并重新实现了sizeHint() 以返回contentsSize()。有用!谢谢。
    猜你喜欢
    • 2019-04-26
    • 1970-01-01
    • 2016-02-16
    • 2018-10-25
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多