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

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

スクロールバーの値の更新は、イベントループでのみ発生すると思われます。

于 2012-03-16T14:30:30.693 に答える
0

多くの試行錯誤の後、最終的にこの問題の原因を突き止めました。

QListView レイアウト モードBatchedを 2x2 のサイズに設定しました。なぜこのセットを持っていたのかはわかりませんが、一度にすべてをレンダリングするのではなく、アイテムのバッチをレンダリングすることで、表示をよりスムーズにすることを意図していると思います. 問題 (私が推測) は、バッチがレンダリングされると継続的に更新されるスクロールバーを台無しにし、すべてがレンダリングされたときに安定した状態 (適切な最大値と値) になることです。その場合にのみ、それを呼び出す意味setValueがあります (ただし、すべてのアイテムがいつレンダリングされたかを知る方法はありません)。

そのため、修正は簡単でした.toを元に戻すだけでlayoutModeSinglePassスクロールバーが期待どおりに機能するようになりました(表示が著しく遅くなることはありません)。スクロールバーの値を保存して復元する必要もありません。そのまま機能します。

于 2012-03-16T16:23:57.430 に答える
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 に答える