首页 > 解决方案 > 为什么 QScrollArea 不考虑垂直滚动条宽度?

问题描述

考虑以下示例,

import sys
from PyQt5 import QtCore, QtWidgets


class scrolldemo(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(scrolldemo, self).__init__(parent)

        widget = QtWidgets.QWidget()
        widget.setFixedSize(QtCore.QSize(500, 600))

        scroll = QtWidgets.QScrollArea()
        scroll.setWidget(widget)
        self.setCentralWidget(scroll)
        self.setWindowTitle("Scroll demo")


def main():
    app = QtWidgets.QApplication(sys.argv)
    ex = scrolldemo()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

小部件的尺寸在垂直方向上略微过大,这会增加一个垂直滚动条。但是,垂直滚动条占用了小部件本身占用的空间。这也需要一个水平滚动条,使窗口看起来像这样:

带有垂直和水平滚动条的滚动区域

我对垂直滚动条没问题,但水平滚动条很笨拙。请注意,水平滚动条所需的额外空间恰好是垂直条的宽度。

这可以通过覆盖sizeHint包含垂直滚动条宽度的方法来解决,

class ScrollAreaWithVerticalBar(QtWidgets.QScrollArea):
    def sizeHint(self):
        hint = super().sizeHint()
        bar_width = self.verticalScrollBar().sizeHint().width()
        return QtCore.QSize(hint.width() + bar_width, hint.height())

具有额外宽度的 QScrollArea

这会产生一个略宽的 QScrollArea,不再需要笨拙的水平滚动条。我通过查看与此问题相关的已关闭 Qt 错误报告得到了这个想法。但是,该错误报告被关闭为“超出范围”,这让我认为这根本不是错误,我使用 QScrollArea 不正确,我的错误使用也需要解决方法。

那么我应该怎么做呢?

标签: qtpyqt

解决方案


推荐阅读