Qt设置setWidgetResizable为true后QScrollArea内自定义控件无法滚动问题
解决方法
核心问题原因
当前实现的冲突根源有两点:
sizeHint中强制将返回高度设为不小于父控件高度,开启setWidgetResizable(true)时,QScrollArea会始终认为内容高度等于自身视口高度,不会触发滚动逻辑- 未重写
minimumSizeHint方法,QScrollArea无法识别自定义控件的内容最小尺寸,拉伸时没有尺寸下限
修改步骤
1. 修改customwidget.h
在protected块中新增minimumSizeHint方法声明:
protected: void paintEvent(QPaintEvent *e); void resizeEvent(QResizeEvent *e); QSize sizeHint() const override; QSize minimumSizeHint() const override; // 新增这行
2. 修改customwidget.cpp的尺寸计算逻辑
删除sizeHint中绑定父控件高度的逻辑,同时实现minimumSizeHint返回内容的最小所需尺寸:
QSize CustomWidget::sizeHint() const { int rows = _rects.size(); int height = rows * 60+2; int width = 120; return QSize(width, height); } // 新增minimumSizeHint实现 QSize CustomWidget::minimumSizeHint() const { return sizeHint(); }
3. 保留QScrollArea的setWidgetResizable配置
不需要注释scroll->setWidgetResizable(true);,保持开启状态即可。如果需要显示滚动条,把垂直滚动条策略改为Qt::ScrollBarAsNeeded即可,隐藏滚动条也不影响滚轮滚动功能。
效果验证
- 当窗口高度小于内容最小高度(602px)时,自定义控件高度固定为最小尺寸,小于滚动区视口高度,可正常滚动
- 当窗口高度大于等于内容最小高度时,自定义控件被自动拉伸填充满整个滚动区空间
内容的提问来源于stack exchange,提问作者user16138748
相关产品推荐
相关产品推荐

