QScrollArea的viewport和滚动窗口的大小关系

1 前言

QScrollArea中总是搞不明白滚动窗口、viewport与子部件的大小关系,以及滚动条出现的时机。因此有了本篇总结。

2 滚动窗口、viewport和子部件的关系

QScrollArea的派生类有很多,如QGraphicsView、QTableView等,超过显示范围就会出现滚动条,以滚动的方式查看内部的子部件。

  1. 概念以及组成关系
    滚动窗口指的是QScrollArea的外边框widget,内部含有视口viewport和滚动条,viewport也是widget,在视口内部含有子部件widget,用于放置要显示的内容。
    总结来说,QScrollArea的外widget嵌入viewport和滚动条,viewport嵌入子部件widget。

  2. viewport的大小和滚动窗口的大小是什么关系?
    viewport用于显示子部件的内容,滚动窗口提供了滚动条来滚动显示子部件的内容。
    viewport在没有滚动条出现时,其紧贴滚动窗口,Size滚动窗口 = Sizeviewport + Size滚动窗口边宽度。viewport在有滚动条时,其区域被滚动条挤压,Size滚动窗口 = Sizeviewport + Size滚动窗口边宽度 + Size水平滚动条宽,垂直滚动条高
    总结说来,viewport在没有滚动条的时候铺满整个滚动窗口;viewport在有滚动条的时候铺满滚动窗口减去滚动条的有效区域。在根据滚动窗口大小来计算viewport大小时,要减去滚动窗口的边界宽,一般是1px * 2,2是两个边界的线宽。

  3. viewport和子部件的大小关系如何影响滚动条的出现?
    子部件放置在viewport内部,子部件大小大于viewport,则出现滚动条,反之不出现。
    但是子部件的大小并不直接影响viewport的大小,只有的子部件的大小大于viewport时出现滚动条挤压viewport的时候,viewport的大小才会改变;而子部件大小小于viewport时,不出现滚动条,此时viewport始终铺满整个滚动区域。

3 如何固定子部件的宽度,始终不出现滚动条?

项目中不想出现水平滚动条,因此需要根据滚动窗口计算viewport的大小,从而固定子部件的大小为viewport的大小,则正好不出现水平滚动条。

int widthOfViewport = widthOfScrollWindow - 2 * borderWidthOfScrollWindow;
childComponent->setFixedWidth(widthOfViewport);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值