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
相关产品推荐
相关产品推荐

