2

在批量布局模式下使用QListWidget时,每当添加的项目超过批量大小时,从旧列表切换到新列表时,列表小部件会闪烁一小段时间。这意味着,列表小部件不显示任何项目,并且滚动条句柄设置为看似随机的大小。

你有没有遇到过这种情况,能以某种方式解决吗?我正在使用 Qt 4.7.4。我可能应该补充一点,我没有使用任何隐藏物品。

4

1 回答 1

5

我也遇到了这个问题,花了几个小时在 Qt 小部件渲染的大海中梳理。最终,我和你一样,将问题追溯到 QListView 的批处理。看起来,当启用批处理时,Qt 会触发一个内部计时器来执行底层滚动视图的增量布局调整。在这些增量布局期间,当滚动条可见时,更新区域计算不正确(它太大并且不考虑滚动小部件本身占用的区域)。结果是一个错误的更新区域随后进入视口更新,它具有清除整个客户区而不渲染任何 ListViewItems 的不幸副作用。

批处理完成后,最终的视口更新会正确计算布局几何(使用滚动条)并生成有效的更新区域;然后重绘列表中的可见元素。

随着列表中项目数量的增加(相对于批量大小),行为会恶化。例如,如果您的列表从 500 项增加到 50000 项,并且批量大小为 50,则触发的“重绘错误”事件的数量会成比例地增加,从而导致视图明显闪烁得更多。:(

这些增量(和失败的)视口更新似乎也导致您描述的滚动条句柄位置出现明显的 spazmodic 行为。

此问题的根源似乎与添加到 QListView::doItemsLayout() 的“hack”有关,如下所述:

// showing the scroll bars will trigger a resize event,
// so we set the state to expanding to avoid
// triggering another layout
QAbstractItemView::State oldState = state();
setState(ExpandingState);

我想你可以重写 QListView::doItemsLayout() 并提供你自己的批处理来正确处理滚动条,但我个人太老了,懒得清理别人的便便。切换到 SinglePass 完全消除了这个问题。无缝的无闪烁渲染和您所期待和喜爱的滚动条行为。耶。

于 2013-01-26T02:10:52.733 回答