考虑以下示例,
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,不再需要笨拙的水平滚动条。通过查看与此问题有关的a closed Qt bug report,我得到了这个想法。但是,该错误报告被关闭为“超出范围”,这使我认为这根本不是错误,并且我错误地使用了QScrollArea,并且我的错误使用也需要一种解决方法。
那我应该怎么做?