如何向 QListWidget() 添加垂直滚动条

问题描述

我有一个 while,其中包含超出其可见边界的 QListWidget,我想添加一个垂直滚动条。我尝试了以下方法

QListWidgetItems

但没有可见的垂直滚动条。但是,当我将 sz = QtCore.QSize(200,200) _lstwdgt = QtGui.QListWidget(parent) _item = QtGui.QListWidgetItem(_lstwdgt) _widget = QtGui.QWidget(parent) _layout = QtGui.QVBoxLayout() for n in range(0,10): _btn = QtGui.QPushButton("test {}".format(n),parent) _layout.addWidget(_btn) _layout.addStretch() _layout.setSizeConstraint(QtGui.QLayout.SetFixedSize) _widget.setLayout(_layout) _item.setSizeHint(_widget.sizeHint()) _lstwdgt.addItem(_item) _lstwdgt.setItemWidget(_item,_widget) _lstwdgt.setFixedSize(sz) vScrollBar = QtGui.QScrollBar(_lstwdgt) _lstwdgt.setVerticalScrollBar(vScrollBar) 更改为 _layout 时,会出现一个水平滚动条,而缺少什么才能获得垂直滚动条?

解决方法

问题是默认每个视图都使用ScrollPerItem滚动模式:在这种模式下,滚动条只用于在items之间滚动,而且由于你的view只有一个item,Qt不认为它必须显示滚动条。

解决办法是将模式改为ScrollPerPixel

_lstwdgt.setVerticalScrollMode(QtGui.QListWidget.ScrollPerPixel)

注意,如果你只需要在可滚动区域添加widgets,使用QListWidget确实是一个非常糟糕的主意,应该使用QScrollArea代替。
此外,添加拉伸是完全没有意义的,因为您对项目使用 sizeHint,并且尺寸提示仅返回最小最佳尺寸(忽略任何拉伸,这是可以缩小到 0 个尺寸)。

我还强烈建议您使用更详细的变量名称,将名称缩写为 _lstwdgt 确实没有任何好处(也不为局部范围内的每个对象添加下划线前缀);我花了更多的时间来理解你的代码做了什么,而不是真正找到问题的原因。请记住,可读性在编程中确实很重要。