7

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

截屏

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

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

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

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

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

4

2 回答 2

3

在 中调用contentsSize()了一个受保护的成员函数QListView。它用于计算滚动条 所需minimum()maximum()、 和(如此所述)。pageStep()

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

于 2010-09-10T14:11:59.630 回答
3

也许你可以在不使用 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 的解决方案更多的小部件。因此,如果您的列表中有数百个项目,这可能不是最佳解决方案。

于 2010-09-10T15:37:29.413 回答