1 前言
QScrollArea中总是搞不明白滚动窗口、viewport与子部件的大小关系,以及滚动条出现的时机。因此有了本篇总结。
2 滚动窗口、viewport和子部件的关系
QScrollArea的派生类有很多,如QGraphicsView、QTableView等,超过显示范围就会出现滚动条,以滚动的方式查看内部的子部件。
-
概念以及组成关系
滚动窗口指的是QScrollArea的外边框widget,内部含有视口viewport和滚动条,viewport也是widget,在视口内部含有子部件widget,用于放置要显示的内容。
总结来说,QScrollArea的外widget嵌入viewport和滚动条,viewport嵌入子部件widget。 -
viewport的大小和滚动窗口的大小是什么关系?
viewport用于显示子部件的内容,滚动窗口提供了滚动条来滚动显示子部件的内容。
viewport在没有滚动条出现时,其紧贴滚动窗口,Size滚动窗口 = Sizeviewport + Size滚动窗口边宽度。viewport在有滚动条时,其区域被滚动条挤压,Size滚动窗口 = Sizeviewport + Size滚动窗口边宽度 + Size水平滚动条宽,垂直滚动条高。
总结说来,viewport在没有滚动条的时候铺满整个滚动窗口;viewport在有滚动条的时候铺满滚动窗口减去滚动条的有效区域。在根据滚动窗口大小来计算viewport大小时,要减去滚动窗口的边界宽,一般是1px * 2,2是两个边界的线宽。 -
viewport和子部件的大小关系如何影响滚动条的出现?
子部件放置在viewport内部,子部件大小大于viewport,则出现滚动条,反之不出现。
但是子部件的大小并不直接影响viewport的大小,只有的子部件的大小大于viewport时出现滚动条挤压viewport的时候,viewport的大小才会改变;而子部件大小小于viewport时,不出现滚动条,此时viewport始终铺满整个滚动区域。
3 如何固定子部件的宽度,始终不出现滚动条?
项目中不想出现水平滚动条,因此需要根据滚动窗口计算viewport的大小,从而固定子部件的大小为viewport的大小,则正好不出现水平滚动条。
int widthOfViewport = widthOfScrollWindow - 2 * borderWidthOfScrollWindow;
childComponent->setFixedWidth(widthOfViewport);