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

Python 如何将垂直滚动条添加到QListWidget()中,python,pyqt4,qlistwidget,qscrollbar,Python,Pyqt4,Qlistwidget,Qscrollbar,我有一个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,

我有一个
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)

但垂直滚动条不可见。但是,当我将
\u layout
更改为
QHBoxLayout()
时,将出现一个水平滚动条,而不是垂直滚动条缺少什么?

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

解决方案是将模式更改为
ScrollPerPixel

_lstwdgt.setVerticalScrollMode(QtGui.QListWidget.ScrollPerPixel)
请注意,如果您只需要将小部件添加到可滚动区域,那么使用QListWidget确实是一个非常糟糕的主意,应该改用QScrollArea。
此外,添加拉伸是完全没有意义的,因为您对项目使用的是
sizeHint
,而大小提示仅返回最小的最佳大小(忽略任何拉伸,这些拉伸是可以收缩为0大小的间隔符)


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

没有必要添加滚动条,因为QListWidget已经有了滚动条,请提供一个…并使其更具可读性_命名所有东西都像这样,这对阅读代码来说不是很好,而且它不会带来任何好处。非常感谢你的建议,以及关于提高可读性的额外建议!至于
QListWidget
vs
QScrollArea
,为什么会选择后者?@stdcerr QListWidget用于显示数据模型的项目,如名称、数字列表,类似于QTableWidget的功能,但仅使用一列;请注意,它们和QTreeWidget都是更高级别的小部件,通过实现内部数据模型,将它们的基本视图小部件(分别为QListView、QTableView和QTreeView)子类化。虽然在某些情况下,它们可以用作小部件容器,但这不是它们的范围。而且,所有这些都是从QAbstractScrollArea继承的,像QScrollArea一样,这是你应该首先考虑的滚动区域的小部件。我强烈建议你阅读和理解它(并且通过阅读与那里引用的类和主题相关的所有文档来加深),然后花些时间阅读章节。您将清楚地看到,这些类与在滚动区域中布局小部件完全无关。同样,虽然在某些情况下它们可以像那样使用,但这更多的是一种可能的用法(几乎是某种“黑客行为”),而不是实际用途。