为什么QScrollArea不考虑垂直滚动条的宽度?

时间:2019-09-12 02:10:48

标签: qt pyqt

考虑以下示例,

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()

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

Scroll area with vertical and horizontal scroll bars

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

这可以通过覆盖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 with extra widght

这将产生一个稍宽的QScrollArea,不再需要笨拙的水平滚动条。通过查看与此问题有关的a closed Qt bug report,我得到了这个想法。但是,该错误报告被关闭为“超出范围”,这使我认为这根本不是错误,并且我错误地使用了QScrollArea,并且我的错误使用也需要一种解决方法。

那我应该怎么做?

0 个答案:

没有答案