このページでは

モデルとビュー:ワーカースレッドを使用した「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

© 2026 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.