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

How can I add a vertical scrollbar to a QListWidget()

我有一个 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 更改为 QHBoxLayout() 时,会出现水平滚动条,缺少什么来获得垂直滚动条?

问题是默认情况下每个视图都使用 ScrollPerItem 滚动模式:在这种模式下,滚动条仅用于在项目之间滚动,并且由于您的视图只有一个项目,Qt 没有不认为它必须显示滚动条。

解决方法是将模式改为ScrollPerPixel:

_lstwdgt.setVerticalScrollMode(QtGui.QListWidget.ScrollPerPixel)

请注意,如果您只需要将小部件添加到可滚动区域,那么使用 QListWidget 确实是一个非常糟糕的主意,应该改用 QScrollArea。
此外,添加拉伸是完全没有意义的,因为您使用的是 sizeHint 的项目,并且尺寸提示仅 returns 最小最优 尺寸(忽略任何拉伸,这是可以缩小到 0 尺寸的垫片)。

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