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

QGraphicsScene中QListWidget滚动时文本不滚动的问题求助

解决QGraphicsScene中嵌入QListWidget滚动时自定义Item内容不跟随滚动的问题

哈,我明白你遇到的问题了——在QGraphicsScene里嵌入的QListWidget中,用setItemWidget添加了带QLineEdit(后来还加了QCheckBox)的项后,滚动列表时自定义控件里的文本不会跟着滚动,但当前选中项的内容却能正常滚动。结合你的场景,我来帮你捋清楚原因和解决办法:

问题根源

当你用setItemWidget给QListWidgetItem绑定自定义widget时,QListWidgetItem默认的尺寸(sizeHint)太小,没法完全装下你的自定义控件。这就导致控件的部分内容超出了item的可视范围,滚动列表时item的位置变了,但控件的显示区域没跟上item的位置更新,看起来就像文本“不滚动”;而当前选中项因为有特殊的刷新逻辑,所以内容能正常滚动。

具体解决步骤

1. 给每个Item设置匹配的尺寸

添加自定义控件到item之后,一定要同步把item的sizeHint设成控件的尺寸,确保item能完全包裹住控件:

// 创建新的列表项和自定义控件
QListWidgetItem *item = new QListWidgetItem(yourListWidget);
QWidget *itemWidget = new QWidget();
QHBoxLayout *layout = new QHBoxLayout(itemWidget);
layout->addWidget(new QCheckBox());
layout->addWidget(new QLineEdit());
itemWidget->setLayout(layout);

// 把控件绑定到列表项
yourListWidget->setItemWidget(item, itemWidget);

// 关键一步:让列表项尺寸适配自定义控件
item->setSizeHint(itemWidget->sizeHint());

2. 调整QListWidget的滚动和刷新设置

如果上面的步骤还没解决问题,可以试试调整QListWidget的滚动模式,确保滚动时列表项能正确刷新:

// 设置滚动模式为按项滚动,保证列表项整体移动
yourListWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerItem);
// 开启不透明绘制属性,避免滚动时的绘制延迟
yourListWidget->setAttribute(Qt::WA_OpaquePaintEvent);
yourListWidget->viewport()->setAttribute(Qt::WA_OpaquePaintEvent);

3. 检查QGraphicsProxyWidget的属性

因为你的QListWidget是嵌在QGraphicsScene里的,要确保包裹它的QGraphicsProxyWidget设置正确,避免交互异常:

QGraphicsProxyWidget *proxy = yourScene->addWidget(yourListWidget);
// 让proxy能正确响应滚动、焦点等交互
proxy->setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsSelectable);
// 让proxy的尺寸适配QListWidget的大小
proxy->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

验证效果

做完这些设置后,重新运行程序,滚动QListWidget时,自定义控件里的内容应该就能跟着列表项一起滚动了,不会再出现文本固定不动的情况。

内容的提问来源于stack exchange,提问作者pazduha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:55:29