QQmlIncubator Class

Die Klasse QQmlIncubator ermöglicht die asynchrone Erstellung von QML-Objekten. Mehr...

Kopfzeile: #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)

Detaillierte Beschreibung

Das Erstellen von QML-Objekten - wie z.B. Delegates in einer Ansicht oder eine neue Seite in einer Anwendung - kann sehr viel Zeit in Anspruch nehmen, insbesondere auf ressourcenbeschränkten mobilen Geräten. Wenn eine Anwendung QQmlComponent::create() direkt verwendet, wird die QML-Objektinstanz synchron erstellt, was, je nach Komplexität des Objekts, zu merklichen Pausen oder Stottern 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 unter Verwendung 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 Inkubator eine Zeit lang laufen (normalerweise durch Rückgabe der Kontrolle an die Ereignisschleife) und rufen Sie ihn dann ab. Es gibt eine Reihe von Möglichkeiten, später wieder auf den Inkubator zuzugreifen. Vielleicht möchten Sie eine Verbindung zu einem der Signale herstellen, die von QQuickWindow gesendet werden, oder Sie möchten speziell dafür eine QTimer ausführen. Sie können das Objekt auch für einen bestimmten Zweck benötigen und den Inkubator abfragen, wenn sich dieser Zweck ergibt.

// Poll the incubator
if (incubator.isReady()) {
    QObject *object = incubator.object();
    // Use created object
}

Asynchrone Inkubatoren werden von einer QQmlIncubationController gesteuert, die auf der QQmlEngine eingestellt ist und die der Engine mitteilt, wann die Anwendung im Leerlauf ist und inkubierende Objekte verarbeitet werden sollen. Wenn auf der QQmlEngine kein Inkubationscontroller eingestellt ist, erstellt QQmlIncubator Objekte synchron, unabhängig vom angegebenen IncubationMode. Standardmäßig ist kein Inkubationscontroller eingestellt. QQuickView , QQuickWindow und QQuickWidget setzen jedoch alle Inkubations-Controller auf ihren jeweiligen QQmlEngines. Diese Inkubations-Controller verteilen die Inkubationen über mehrere Frames, während die Ansicht gerendert wird.

QQmlIncubator unterstützt drei Inkubationsmodi:

  • Synchronous Die Erstellung erfolgt synchron. Das heißt, sobald der QQmlComponent::create()-Aufruf zurückkehrt, befindet sich der Inkubator bereits entweder im Fehler- oder im Bereitschaftsstatus. Ein synchroner Inkubator hat keinen wirklichen Vorteil gegenüber der direkten Verwendung der synchronen Erstellungsmethoden auf QQmlComponent, aber es kann die Implementierung einer Anwendung vereinfachen, wenn dieselbe API sowohl für synchrone als auch für asynchrone Erstellungen verwendet wird.
  • Asynchron (Standard) Die Erstellung erfolgt asynchron, vorausgesetzt, auf QQmlEngine ist ein QQmlIncubatorController eingestellt.

    Der Inkubator bleibt im Zustand Loading, bis entweder die Erstellung abgeschlossen ist oder ein Fehler auftritt. Der Callback statusChanged() kann verwendet werden, um über Statusänderungen informiert zu werden.

    Anwendungen sollten den asynchronen Inkubationsmodus verwenden, um Objekte zu erstellen, die nicht sofort benötigt werden. Zum Beispiel verwendet der Typ ListView die asynchrone Inkubation, um Objekte zu erstellen, die sich etwas außerhalb des Bildschirms befinden, während die Liste gescrollt wird. Wenn das Objekt während der asynchronen Erstellung sofort benötigt wird, kann die Methode QQmlIncubator::forceCompletion() aufgerufen werden, um den Erstellungsprozess synchron zu beenden.

  • AsynchronousIfNested Die Erstellung erfolgt asynchron, wenn sie Teil einer verschachtelten asynchronen Erstellung ist, oder synchron, wenn nicht.

    In den meisten Szenarien, in denen eine QML-Komponente den Anschein einer synchronen Instanziierung erwecken möchte, sollte sie diesen Modus verwenden.

    Dieser Modus lässt sich am besten anhand eines Beispiels erklären. Wenn der Typ ListView zum ersten Mal erstellt wird, muss er sich selbst mit einem anfänglichen Satz von anzuzeigenden Delegierten bestücken. Wenn die ListView 400 Pixel hoch ist und jeder Delegat 100 Pixel hoch ist, müssen vier anfängliche Delegateninstanzen erstellt werden. Wenn ListView den asynchronen Inkubationsmodus verwendet, wird ListView immer leer erstellt und irgendwann später werden die vier anfänglichen Elemente angezeigt.

    Würde ListView dagegen den synchronen Inkubationsmodus verwenden, würde es sich korrekt verhalten, aber es könnte zu Stottern in der Anwendung kommen. Da QML anhalten und die Delegaten von ListView synchron instanziieren müsste, würde dies einen Großteil der Vorteile der asynchronen Instanziierung zunichte machen, wenn ListView Teil einer QML-Komponente ist, die asynchron instanziiert wird.

    Der Modus AsynchronousIfNested löst dieses Problem. Durch die Verwendung von AsynchronousIfNested werden die Delegierten von ListView asynchron instanziiert, wenn ListView selbst bereits Teil einer asynchronen Instanziierung ist, und ansonsten 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 zu dem Zeitpunkt, an dem die äußere asynchrone Instanziierung abgeschlossen ist, innere Elemente wie ListView bereits das Laden ihrer anfänglichen Delegierten abgeschlossen haben.

    Es ist fast immer falsch, die synchrone Instanziierung zu verwenden - Elemente oder Komponenten, die den Anschein einer synchronen Instanziierung erwecken wollen, aber ohne die Nachteile der Einführung von Freezes oder Stutters in die Anwendung, sollten den AsynchronousIfNested Inkubationsmodus verwenden.

Dokumentation der Mitgliedstypen

enum QQmlIncubator::IncubationMode

Gibt den Modus an, in dem der Inkubator arbeitet. Unabhängig vom Inkubationsmodus verhält sich ein QQmlIncubator synchron, wenn auf QQmlEngine keine QQmlIncubationController eingestellt ist.

KonstanteWertBeschreibung
QQmlIncubator::Asynchronous0Das Objekt wird asynchron erstellt.
QQmlIncubator::AsynchronousIfNested1Wenn das Objekt in einem Kontext erstellt wird, der bereits Teil einer asynchronen Erstellung ist, schließt sich dieser Inkubator dieser bestehenden Inkubation an und wird asynchron ausgeführt. Die bestehende Inkubation wird erst dann bereit, wenn sowohl sie als auch diese Inkubation abgeschlossen sind. Andernfalls wird die Inkubation synchron ausgeführt.
QQmlIncubator::Synchronous2Das Objekt wird synchron erstellt.

enum QQmlIncubator::Status

Gibt den Status des QQmlIncubator an.

KonstanteWertBeschreibung
QQmlIncubator::Null0Die Inkubation ist nicht im Gange. Rufen Sie QQmlComponent::create() auf, um mit der Inkubation zu beginnen.
QQmlIncubator::Ready1Das Objekt ist vollständig erstellt und kann durch Aufruf von object() aufgerufen werden.
QQmlIncubator::Loading2Das Objekt wird gerade erstellt.
QQmlIncubator::Error3Ein Fehler ist aufgetreten. Der Fehler kann durch den Aufruf von errors() behoben werden.

Dokumentation der Mitgliedsfunktionen

QQmlIncubator::QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)

Erstellen Sie einen neuen Inkubator mit dem angegebenen mode

void QQmlIncubator::clear()

Löscht den Inkubator. Eine laufende Inkubation wird abgebrochen. Wenn sich der Inkubator im Zustand Bereit befindet, wird das erstellte Objekt nicht gelöscht.

QList<QQmlError> QQmlIncubator::errors() const

Gibt die Liste der bei der Inkubation des Objekts aufgetretenen Fehler zurück.

void QQmlIncubator::forceCompletion()

Erzwingt die synchrone Beendigung einer laufenden Inkubation. Sobald dieser Aufruf zurückkehrt, befindet sich der Inkubator nicht mehr im Zustand "Loading".

QQmlIncubator::IncubationMode QQmlIncubator::incubationMode() const

Gibt den Inkubationsmodus zurück, der an den QQmlIncubator Konstruktor übergeben wurde.

bool QQmlIncubator::isError() const

Gibt true zurück, wenn status() des Inkubators Error ist.

bool QQmlIncubator::isLoading() const

Gibt true zurück, wenn status() des Inkubators geladen ist.

bool QQmlIncubator::isNull() const

Gibt true zurück, wenn status() des Inkubators Null ist.

bool QQmlIncubator::isReady() const

Gibt true zurück, wenn status() des Inkubators bereit ist.

QObject *QQmlIncubator::object() const

Gibt das inkubierte Objekt zurück, wenn der Status Bereit ist, sonst 0.

void QQmlIncubator::setInitialProperties(const QVariantMap &initialProperties)

Speichert eine Zuordnung von Eigenschaftsnamen zu Anfangswerten, die in initialProperties enthalten sind, mit denen die inkubierte Komponente initialisiert wird.

Siehe auch QQmlComponent::setInitialProperties.

[virtual protected] void QQmlIncubator::setInitialState(QObject *object)

Wird aufgerufen, nachdem object zum ersten Mal erstellt wurde, aber bevor komplexe Eigenschaftsbindungen ausgewertet werden und gegebenenfalls QQmlParserStatus::componentComplete() aufgerufen wird. Dies entspricht dem Punkt zwischen QQmlComponent::beginCreate() und QQmlComponent::completeCreate() und kann verwendet werden, um den Eigenschaften des Objekts Anfangswerte zuzuweisen.

Die Standardimplementierung tut nichts.

Hinweis: Einfache Bindungen wie numerische Literale werden ausgewertet, bevor setInitialState() aufgerufen wird. Die Kategorisierung von Bindungen in einfache und komplexe ist absichtlich nicht spezifiziert und kann sich zwischen verschiedenen Versionen von Qt und abhängig davon, ob und wie Sie qmlcachegen verwenden, ändern. Sie sollten sich nicht darauf verlassen, dass eine bestimmte Bindung entweder vor oder nach dem Aufruf von setInitialState() ausgewertet wird. Zum Beispiel kann ein konstanter Ausdruck wie MyType.EnumValue zur Kompilierzeit als solcher erkannt werden oder erst später als Bindung ausgeführt werden. Das Gleiche gilt für konstante Ausdrücke wie -(5) oder "a" + " constant string".

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 tut nichts.

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