You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt设置setWidgetResizable为true后QScrollArea内自定义控件无法滚动问题

解决方法

核心问题原因

当前实现的冲突根源有两点:

  1. sizeHint中强制将返回高度设为不小于父控件高度,开启setWidgetResizable(true)时,QScrollArea会始终认为内容高度等于自身视口高度,不会触发滚动逻辑
  2. 未重写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:54:00