モデルとビューワーカースレッドを使用した Fetch More 機能

レスポンシブな UI を維持しながら、ワーカースレッドで fetchMore() を実装する方法を示します。

この例では、データ取得が UI をブロックしないように、オブジェクトをQThread に移動してQAbstractItemModel::fetchMore() を利用する方法を示します。各呼び出しで、FetchWorker は2秒間スリープし、遅いバックエンド・サービスをシミュレートしてから、UIスレッドにさらにデータを送信します。

基本的な機能

ワーカースレッドでデータがフェッチされている間、モデルはリストの最後にBusyIndicator を追加します。データが正常に取得されると、BusyIndicator が削除され、新しい項目がリストに追加されます。ListView は一般的な方法で使用され、遅いモデルに対応するための調整は必要ありません。

責任

項目モデルの変更(この場合、行の挿入と削除)は、UIスレッドで行わなければならない。ワーカースレッドオブジェクトはゆっくりと DataBlock 構造体を構築し、QList データブロックをペイロードとしてdataFetched シグナルを送出します。このシグナルはQt::QueuedConnection を介して ThreadedFetchMoreModel::dataReceived() スロットに送られ、UI スレッドのデータリストに追加されます。UI スレッドは、フェッチ処理を開始するために fetchDataBlock() シグナルをワーカー オブジェクトに送信する前に、プレースホルダ項目をリストの最後に追加し、新しい項目をリストに追加する前にプレースホルダを削除します。

利用可能なデータがすべて取得されると、ワーカースレッドオブジェクトはnoMoreToFetch シグナルをモデルに送信します。それ以降、canFetchMore() メソッドは常にfalse を返します。

プロジェクト例 @ code.qt.io

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.