调整大小而不是滚动的QListWidget

时间:2010-09-10 13:59:44

标签: c++ qt qlistview qlistwidget

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

screen shot

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

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

上面的布局并不奇怪:QLabel中的两个QListWidget和两个QVBoxLayout.以下是我在QListWidget上设置的属性:

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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的解决方案创建更多的小部件。因此,如果您的列表中有数百个项目,这可能不是最佳解决方案。