Modelle und Ansichten: Fetch More-Funktionalität mit einem Worker-Thread

Zeigt, wie man fetchMore() in einem Worker-Thread implementiert und dabei eine reaktionsfähige Benutzeroberfläche beibehält.

Dieses Beispiel zeigt, wie QAbstractItemModel::fetchMore() mit einem auf QThread verschobenen Objekt verwendet werden kann, so dass das Abrufen der Daten die Benutzeroberfläche nicht blockiert. Bei jedem Aufruf schläft FetchWorker für 2 Sekunden, um einen langsamen Backend-Dienst zu simulieren, bevor weitere Daten an den UI-Thread gesendet werden.

Grundlegende Funktionen

Während die Daten im Worker-Thread abgerufen werden, fügt das Modell eine BusyIndicator an das Ende der Liste an. Sobald die Daten erfolgreich abgeholt wurden, wird die BusyIndicator entfernt und neue Elemente werden an die Liste angehängt. Die ListView wird auf die übliche Weise verwendet und muss nicht an das langsame Modell angepasst werden.

Zuständigkeiten

Die Änderungen am Elementmodell (in diesem Fall das Einfügen und Entfernen von Zeilen) müssen im UI-Thread erfolgen. Das Worker-Thread-Objekt konstruiert langsam DataBlock-Strukturen und sendet das Signal dataFetched mit einer QList von Datenblöcken als Nutzlast; das Signal wird über einen Qt::QueuedConnection an den ThreadedFetchMoreModel::dataReceived() Slot gesendet, der sie an die Datenliste im UI-Thread anhängt. Der UI-Thread fügt am Ende der Liste ein Platzhalterelement hinzu, bevor er das Signal fetchDataBlock() an das Worker-Objekt sendet, um den Abrufprozess einzuleiten, und entfernt den Platzhalter, bevor er neue Elemente an die Liste anhängt.

Nachdem alle verfügbaren Daten abgeholt wurden, sendet das Worker-Thread-Objekt das Signal noMoreToFetch an das Modell; von da an gibt die Methode canFetchMore() immer false zurück.

Beispielprojekt @ 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.