在批处理模式下使用QListWidget时出现闪烁问题

时间:2012-05-05 17:54:09

标签: c++ qt qlistwidget

在批处理布局模式下使用QListWidget时,如果添加的项目多于批处理大小,则从旧列表切换到新列表时,列表窗口小部件会短暂闪烁。这意味着,列表小部件不显示任何项目,滚动条句柄设置为看似随机的大小。

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

1 个答案:

答案 0 :(得分:4)

我也遇到过这个问题,花了好几个小时梳理Qt小部件渲染。最终,像你一样,我将问题追溯到QListView的批处理。看来,当启用批处理时,Qt将触发内部计时器以执行基础滚动视图的增量布局调整。在这些增量布局期间,当滚动条可见时,更新区域不能正确计算(它太大并且不考虑滚动窗口小部件本身占用的区域)。结果是一个糟糕的更新区域,随后进入视口更新,这会产生令人遗憾的副作用,即清除整个客户区而不渲染任何ListViewItem。

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

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

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

此问题的根源似乎与此添加的“黑客”有关 QListView :: doItemsLayout()如下所示:

// 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完全消除了这个问题。无缝的无闪烁渲染和您期望和喜爱的滚动条行为。耶。

相关问题