Qt 如何在模型更新后使QListView的滚动条报告其正确的值?

Qt 如何在模型更新后使QListView的滚动条报告其正确的值?,qt,scrollbar,qlistview,Qt,Scrollbar,Qlistview,我试图在更新模型后立即设置QListView滚动条的值。问题是滚动条当时没有正确设置,因此其最大值不正确。这意味着当我设置该值时,它将永远不会超过这个(不正确的)最大值。如果我在其他地方添加一些qDebug语句,我可以在一段时间后看到最大值是正确的 我想我需要以某种方式强制更新滚动条或视图,但我尝试了各种方法-updateGeometry,repaint,update,setFlow,等等,但都没有成功 对我能做什么有什么建议吗?以下是我目前的代码: int previousScrollValu

我试图在更新模型后立即设置QListView滚动条的值。问题是滚动条当时没有正确设置,因此其
最大值不正确。这意味着当我设置该值时,它将永远不会超过这个(不正确的)最大值。如果我在其他地方添加一些
qDebug
语句,我可以在一段时间后看到最大值是正确的

我想我需要以某种方式强制更新滚动条或视图,但我尝试了各种方法-
updateGeometry
repaint
update
setFlow
,等等,但都没有成功

对我能做什么有什么建议吗?以下是我目前的代码:

int previousScrollValue = cardList_->verticalScrollBar()->value();

qDebug() << "Before" << previousScrollValue;

CardListModel* model = new CardListModel(deck->id());
cardList_->setModel(model); 
cardList_->verticalScrollBar()->setValue(previousScrollValue);

qDebug() << "After" << cardList_->verticalScrollBar()->value(); // Wrong value
qDebug() << "Max" << cardList_->verticalScrollBar()->maximum(); // Wrong value
int-previousScrollValue=cardList_u2;->垂直滚动条()->value();
qDebug()setModel(model);
cardList->verticalScrollBar()->设置值(previousScrollValue);
qDebug()值();//错误值
qDebug()最大值();//错误值
我认为这就是您需要调用的函数。如果您检查
scrollToBottom
函数的实现,您将看到这是调用的函数:

void QAbstractItemView::scrollToBottom()
{
    Q_D(QAbstractItemView);
    if (d->delayedPendingLayout) {
        d->executePostedLayout();
        updateGeometries();
    }
    verticalScrollBar()->setValue(verticalScrollBar()->maximum());
}
updateGeometry
不同的是,视图的子窗口小部件的几何图形将被更新

如果这不起作用,你可以:

cardList_->scrollToBottom();
qDebug() << "Max" << cardList_->verticalScrollBar()->maximum();
cardList_uu->scrollToBottom();
qDebug()最大值();

您是否尝试将
QCoreApplication::processEvents()
放在
setModel
之后?即:

CardListModel* model = new CardListModel(deck->id());
cardList_->setModel(model); 
QCoreApplication::processEvents();
cardList_->verticalScrollBar()->setValue(previousScrollValue);

qDebug() << "After" << cardList_->verticalScrollBar()->value(); // Wrong value
qDebug() << "Max" << cardList_->verticalScrollBar()->maximum(); // Wrong value
CardListModel*model=新的CardListModel(deck->id());
卡片列表->设置模型(模型);
QCoreApplication::processEvents();
cardList->verticalScrollBar()->设置值(previousScrollValue);
qDebug()值();//错误值
qDebug()最大值();//错误值

我怀疑更新滚动条值只会发生在事件循环中。

经过多次尝试和错误,我终于找到了导致此问题的原因:

我将QListView布局模式设置为批处理,大小为2x2。我不知道为什么我有这个设置,但我想它的目的是通过渲染成批的项目而不是一次渲染所有内容来使显示更加平滑。问题(我猜)是它弄乱了滚动条,滚动条会随着批处理的渲染而不断更新,只有在渲染所有内容时,滚动条才会处于稳定状态(具有适当的最大值和值)。只有这样,对其调用
setValue
才有意义(但无法知道所有项目何时都已呈现)


因此,解决方法很简单-我只是将
布局模式设置回
单通道模式
,现在滚动条按预期工作(并且显示速度不会明显变慢)。也不需要保存和恢复滚动条值,它可以按原样工作。

您必须在设置任何值之前设置最大值…@UmNyobe,最大值由QListView自动设置。我的问题是,在我更改模型后,它没有立即设置。请告诉我设置滚动条值的最终结果。可能有更好的解决方案来实现您的目标。@Koying,当我更改模型时,滚动条会回到顶部,而我需要它保持在原来的位置(当用户查看视图时,模型可能会被更新)。您的意思是列表会移到顶部,而您希望它保持在底部,对吗?谢谢,我会看一下
updategeometrics
scrolltobttom
。我也遇到了同样的问题。但我的布局模式总是标志性的。我仍然无法更改滚动条的范围。有什么解决办法吗?@MikeShaw,我建议你发布一个新问题,因为如果没有看到任何代码,很难帮助你。