QQmlIncubator Class
Die Klasse „QQmlIncubator“ ermöglicht die asynchrone Erstellung von QML-Objekten. Mehr...
| Überschrift: | #include <QQmlIncubator> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
| qmake: | QT += qml |
Öffentliche Typen
| enum | IncubationMode { Asynchronous, AsynchronousIfNested, Synchronous } |
| enum | Status { Null, Ready, Loading, Error } |
Öffentliche Funktionen
| QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous) | |
| void | clear() |
| QList<QQmlError> | errors() const |
| void | forceCompletion() |
| QQmlIncubator::IncubationMode | incubationMode() const |
| bool | isError() const |
| bool | isLoading() const |
| bool | isNull() const |
| bool | isReady() const |
| QObject * | object() const |
| void | setInitialProperties(const QVariantMap &initialProperties) |
| QQmlIncubator::Status | status() const |
Geschützte Funktionen
| virtual void | setInitialState(QObject *object) |
| virtual void | statusChanged(QQmlIncubator::Status status) |
Ausführliche Beschreibung
Das Erstellen von QML-Objekten – wie z. B. Delegaten in einer Ansicht oder einer neuen Seite in einer Anwendung – kann erheblich Zeit in Anspruch nehmen, insbesondere auf mobilen Geräten mit begrenzten Ressourcen. Wenn eine Anwendung QQmlComponent::create() direkt verwendet, wird die QML-Objektinstanz synchron erstellt, was je nach Komplexität des Objekts zu spürbaren Verzögerungen oder Rucklern in der Anwendung führen kann.
Die Verwendung von `QQmlIncubator` bietet mehr Kontrolle über die Erstellung eines QML-Objekts, einschließlich der Möglichkeit, es asynchron während der Leerlaufzeit der Anwendung zu erstellen. Das folgende Beispiel zeigt eine einfache Verwendung von `QQmlIncubator`.
// Initialize the incubator
QQmlIncubator incubator;
component->create(incubator);Lassen Sie den Incubator eine Weile laufen (normalerweise, indem Sie die Kontrolle an die Ereignisschleife zurückgeben) und fragen Sie ihn dann ab. Es gibt verschiedene Möglichkeiten, später zum Incubator zurückzukehren. Sie können sich an eines der von ` QQuickWindow` gesendeten Signale anbinden oder eigens dafür einen ` QTimer ` ausführen. Möglicherweise benötigen Sie das Objekt auch für einen bestimmten Zweck und fragen den Inkubator ab, sobald dieser Zweck eintritt.
// Poll the incubator
if (incubator.isReady()) {
QObject *object = incubator.object();
// Use created object
}Asynchrone Inkubatoren werden über ein „ QQmlIncubationController “ gesteuert, das auf dem „ QQmlEngine “ festgelegt ist; dieses teilt der Engine mit, wann die Anwendung im Leerlauf ist und inkubierte Objekte verarbeitet werden sollten. Wenn kein Inkubations-Controller unter „ QQmlEngine “ festgelegt ist, erstellt „ QQmlIncubator “ Objekte synchron, unabhängig von der angegebenen „ IncubationMode “. Standardmäßig ist kein Inkubations-Controller festgelegt. Allerdings legen „ QQuickView “, „ QQuickWindow “ und „ QQuickWidget “ alle Inkubations-Controller in ihren jeweiligen „ QQmlEngines“ fest. Diese Inkubations-Controller verteilen die Inkubationen über mehrere Frames, während die Ansicht gerendert wird.
QQmlIncubator unterstützt drei Inkubationsmodi:
- Synchron: Die Erstellung erfolgt synchron. Das heißt, sobald der Aufruf von ` QQmlComponent::create()` zurückkehrt, befindet sich der Inkubator bereits im Zustand „Error“ oder „Ready“. Ein synchroner Inkubator bietet keinen wirklichen Vorteil gegenüber der direkten Verwendung der synchronen Erstellungsmethoden auf ` QQmlComponent `, kann jedoch die Implementierung einer Anwendung vereinfachen, da für synchrone und asynchrone Erstellungen dieselbe API verwendet wird.
- Asynchron (Standard) Die Erstellung erfolgt asynchron, vorausgesetzt, auf ` QQmlEngine` ist ein `QQmlIncubatorController` festgelegt.
Der Incubator verbleibt im Status „Loading“, bis entweder die Erstellung abgeschlossen ist oder ein Fehler auftritt. Der Callback ` statusChanged()` kann verwendet werden, um über Statusänderungen benachrichtigt zu werden.
Anwendungen sollten den asynchronen Inkubationsmodus verwenden, um Objekte zu erstellen, die nicht sofort benötigt werden. Beispielsweise nutzt der Typ ` ListView ` die asynchrone Inkubation, um Objekte zu erstellen, die sich beim Scrollen der Liste leicht außerhalb des Bildschirms befinden. Wenn das Objekt während der asynchronen Erstellung sofort benötigt wird, kann die Methode ` QQmlIncubator::forceCompletion()` aufgerufen werden, um den Erstellungsprozess synchron abzuschließen.
- AsynchronousIfNested Die Erstellung erfolgt asynchron, wenn sie Teil einer verschachtelten asynchronen Erstellung ist, andernfalls synchron.
In den meisten Szenarien, in denen eine QML-Komponente das Erscheinungsbild einer synchronen Instanziierung erzielen möchte, sollte dieser Modus verwendet werden.
Dieser Modus lässt sich am besten anhand eines Beispiels erläutern. Wenn der Typ „ ListView “ zum ersten Mal erstellt wird, muss er sich selbst mit einem anfänglichen Satz von Delegaten füllen, um angezeigt zu werden. Wäre der „ ListView “ 400 Pixel hoch und jeder Delegate 100 Pixel hoch, müssten vier anfängliche Delegate-Instanzen erstellt werden. Würde der „ ListView “ den asynchronen Inkubationsmodus verwenden, würde der „ ListView “ immer leer erstellt und erst zu einem späteren Zeitpunkt würden die vier anfänglichen Elemente erscheinen.
Umgekehrt würde sich die „ ListView “ bei Verwendung des synchronen Inkubationsmodus zwar korrekt verhalten, dies könnte jedoch zu Rucklern in der Anwendung führen. Da QML anhalten und die Delegaten von „ ListView “ synchron instanziieren müsste, würde dies einen Großteil des Vorteils der asynchronen Instanziierung zunichte machen, wenn „ ListView “ Teil einer QML-Komponente wäre, die asynchron instanziiert wird.
Der Modus „ AsynchronousIfNested “ löst dieses Problem. Durch die Verwendung von ` AsynchronousIfNested` werden die Delegaten von ` ListView ` asynchron instanziiert, wenn die ` ListView ` selbst bereits Teil einer asynchronen Instanziierung ist, andernfalls synchron. Im Falle einer verschachtelten asynchronen Instanziierung wird die äußere asynchrone Instanziierung erst abgeschlossen, nachdem alle verschachtelten Instanziierungen ebenfalls abgeschlossen sind. Dadurch wird sichergestellt, dass zum Zeitpunkt des Abschlusses der äußeren asynchronen Instanziierung die inneren Elemente wie ListView das Laden ihrer anfänglichen Delegaten bereits abgeschlossen haben.
Die Verwendung des Inkubationsmodus „Synchronous“ ist fast immer falsch – Elemente oder Komponenten, die den Anschein einer synchronen Instanziierung erwecken sollen, ohne jedoch die Nachteile wie Einfrieren oder Ruckeln in der Anwendung zu verursachen, sollten den Inkubationsmodus „ AsynchronousIfNested “ verwenden.
Dokumentation zu Mitgliedstypen
enum QQmlIncubator::IncubationMode
Legt den Betriebsmodus des Inkubators fest. Unabhängig vom Inkubationsmodus verhält sich ein „ QQmlIncubator “ synchron, wenn für die „ QQmlEngine “ kein „ QQmlIncubationController “ festgelegt ist.
| Konstante | Wert | Beschreibung |
|---|---|---|
QQmlIncubator::Asynchronous | 0 | Das Objekt wird asynchron erstellt. |
QQmlIncubator::AsynchronousIfNested | 1 | Wird das Objekt in einem Kontext erstellt, der bereits Teil einer asynchronen Erstellung ist, schließt sich dieser Inkubator der bestehenden Inkubation an und wird asynchron ausgeführt. Die bestehende Inkubation wird erst dann den Status „Ready“ annehmen, wenn sowohl sie als auch diese Inkubation abgeschlossen sind. Andernfalls wird die Inkubation synchron ausgeführt. |
QQmlIncubator::Synchronous | 2 | Das Objekt wird synchron erstellt. |
enum QQmlIncubator::Status
Gibt den Status des „ QQmlIncubator “ an.
| Konstante | Wert | Beschreibung |
|---|---|---|
QQmlIncubator::Null | 0 | Die Inkubation läuft nicht. Rufen Sie ` QQmlComponent::create()` auf, um die Inkubation zu starten. |
QQmlIncubator::Ready | 1 | Das Objekt ist vollständig erstellt und kann durch Aufruf von ` object()` aufgerufen werden. |
QQmlIncubator::Loading | 2 | Das Objekt wird gerade erstellt. |
QQmlIncubator::Error | 3 | Es ist ein Fehler aufgetreten. Die Fehler können durch Aufruf von ` errors()` abgerufen werden. |
Dokumentation der Mitgliedsfunktionen
QQmlIncubator::QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)
Erstellen Sie einen neuen Inkubator mit den angegebenen mode
void QQmlIncubator::clear()
Leert den Inkubator. Alle laufenden Inkubationsprozesse werden abgebrochen. Befindet sich der Inkubator im Status „Bereit“, wird das erstellte Objekt nicht gelöscht.
QList<QQmlError> QQmlIncubator::errors() const
Gibt die Liste der Fehler zurück, die beim Inkubieren des Objekts aufgetreten sind.
void QQmlIncubator::forceCompletion()
Erzwinge den synchronen Abschluss aller laufenden Inkubationsprozesse. Sobald dieser Aufruf zurückkehrt, befindet sich der Inkubator nicht mehr im Status „Loading“.
QQmlIncubator::IncubationMode QQmlIncubator::incubationMode() const
Gibt den an den Konstruktor von ` QQmlIncubator ` übergebenen Inkubationsmodus zurück.
bool QQmlIncubator::isError() const
Gibt „true“ zurück, wenn die Methode „ status()“ des Inkubators den Fehler „Error“ zurückgibt.
bool QQmlIncubator::isLoading() const
Gibt „true“ zurück, wenn der Status des Inkubators („ status()“) „Loading“ lautet.
bool QQmlIncubator::isNull() const
Gibt „true“ zurück, wenn die Methode „ status()“ des Inkubators den Wert „null“ hat.
bool QQmlIncubator::isReady() const
Gibt „true“ zurück, wenn die Funktion „ status()“ des Inkubators den Status „Ready“ hat.
QObject *QQmlIncubator::object() const
Gibt das inkubierte Objekt zurück, wenn der Status „Ready“ lautet, andernfalls 0.
void QQmlIncubator::setInitialProperties(const QVariantMap &initialProperties)
Speichert eine Zuordnung von Eigenschaftsnamen zu Anfangswerten, die in „ initialProperties “ enthalten sind und mit denen die inkubierte Komponente initialisiert wird.
Siehe auch „ QQmlComponent::setInitialProperties “.
[virtual protected] void QQmlIncubator::setInitialState(QObject *object)
Wird aufgerufen, nachdem die ` object ` erstmals erstellt wurde, jedoch bevor komplexe Eigenschaftsbindungen ausgewertet werden und gegebenenfalls ` QQmlParserStatus::componentComplete()` aufgerufen wird. Dies entspricht dem Zeitpunkt zwischen ` QQmlComponent::beginCreate()` und ` QQmlComponent::completeCreate()` und kann genutzt werden, um den Eigenschaften des Objekts Anfangswerte zuzuweisen.
Die Standardimplementierung führt keine Aktion aus.
Hinweis: Einfache Bindungen wie numerische Literale werden ausgewertet, bevor `setInitialState()` aufgerufen wird. Die Einteilung der Zuordnungen in einfache und komplexe ist bewusst nicht festgelegt und kann sich zwischen verschiedenen Qt-Versionen sowie je nachdem, ob und wie Sie qmlcachegen verwenden, ändern. Sie sollten sich nicht darauf verlassen, dass eine bestimmte Zuordnung entweder vor oder nach dem Aufruf von `setInitialState()` ausgewertet wird. Beispielsweise kann ein konstanter Ausdruck wie ` MyType.EnumValue ` bereits zur Kompilierungszeit als solcher erkannt oder erst später als Bindung ausgeführt werden. Dasselbe gilt für konstante Ausdrücke wie `-(5)` oder „a“ + „konstante Zeichenkette“.
QQmlIncubator::Status QQmlIncubator::status() const
Gibt den aktuellen Status des Inkubators zurück.
[virtual protected] void QQmlIncubator::statusChanged(QQmlIncubator::Status status)
Wird aufgerufen, wenn sich der Status des Inkubators ändert. „ status “ ist der neue Status.
Die Standardimplementierung führt keine Aktion aus.
© 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.