1

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

我想我需要以某种方式强制更新滚动条或视图,但我尝试了各种方法 - updateGeometryrepaintupdatesetFlow等,但没有任何成功。

关于我能做什么的任何建议?以下是我当前的代码:

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
4

3 回答 3

0

我认为这updateGeometries是您需要调用的函数。如果您检查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();
于 2012-03-16T09:11:48.670 回答
0

您是否尝试在QCoreApplication::processEvents()之后放置一个setModel?IE:

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

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

于 2012-03-16T14:30:30.693 回答
0

经过大量的反复试验,我终于找到了导致此问题的原因:

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

layoutMode所以,修复很简单——我只是将to设置回SinglePass,现在滚动条按预期工作(并且显示没有明显变慢)。也不需要保存和恢复滚动条值,它可以按原样工作。

于 2012-03-16T16:23:57.430 回答