QML-Werttypen und Sequenzreferenzen
QML-Werttypen und QML-Sequenztypen werden zwangsläufig als Wert übergeben. Im Gegensatz zu QML-Objekttypen haben sie keine eigene Identität, sondern sind nur als Eigenschaften anderer Objekte oder Werte oder als von Methoden zurückgegebene Werte zugänglich. Jeder solcher Zugriff erzeugt implizit eine Kopie. In JavaScript ist jedoch alles ein Objekt. In JavaScript gibt es kein Konzept eines Werttyps. Wenn Sie beispielsweise font.bold = true in JavaScript ausführen, erwarten wir, dass die Eigenschaft ` bold ` von ` font ` gesetzt wird, unabhängig davon, was ` font ` ist. Betrachten Sie jedoch den folgenden Codeausschnitt:
import QtQuick
Text {
onSomethingHappened: font.bold = true
}In diesem Fall wissen wir, dass „ font “ ein Werttyp ist. Beim Zugriff darauf wird durch den Aufruf des Getter-Methoden von „ Q_PROPERTY “ eine lokale Kopie erstellt. Wir können dann die Eigenschaft „ bold “ darauf setzen, doch dies würde sich normalerweise nur auf die Kopie auswirken, nicht auf das Original „ Q_PROPERTY “.
Um dieses Problem zu lösen, bietet QML das Konzept der Referenzen an. Wenn Sie eine Instanz eines Wert- oder Sequenztyps aus einer Eigenschaft abrufen, merkt sich die QML-Engine die Eigenschaft zusammen mit dem Wert selbst. Wird der Wert geändert, wird er wieder in die Eigenschaft zurückgeschrieben. Dies erzeugt die Illusion eines Objekts mit eigener Identität und sorgt dafür, dass der oben beschriebene Fall – ebenso wie viele andere – einfach funktioniert.
Dies kann jedoch recht aufwendig sein. Wenn eine Sequenz als „ Q_PROPERTY “ exponiert wird, führt der Zugriff auf einen beliebigen Wert in der Sequenz über den Index dazu, dass die gesamten Sequenzdaten aus der Eigenschaft gelesen werden. Aus diesen Sequenzdaten wird dann ein einzelnes Element abgerufen. Ebenso führt die Änderung eines beliebigen Werts in der Sequenz dazu, dass die Sequenzdaten gelesen werden. Anschließend wird die Änderung durchgeführt und die geänderte Sequenz wieder in die Eigenschaft geschrieben. Ein Lesevorgang kann relativ ressourcenschonend sein, wenn der betreffende Typ implizit gemeinsam genutzt wird. Eine Änderung erfordert immer mindestens eine tiefe Kopie.
Wenn Sie eine Instanz eines Sequenz- oder Werttyps aus einer ` Q_INVOKABLE `-Funktion zurückgeben, vermeiden Sie diesen Overhead. Rückgabewerte sind an keine Eigenschaft gebunden und werden nicht zurückgeschrieben.
Sequenzen von Objekttypen werden standardmäßig als „ QQmlListProperty “ übergeben. ` QQmlListProperty ` ist kein tatsächlicher Container, sondern lediglich eine Ansicht oder Referenz auf einen sequenziellen Speicher. Daher ist ` QQmlListProperty ` von diesem Effekt nicht betroffen. Sie können jedoch mithilfe von ` QML_SEQUENTIAL_CONTAINER` andere Sequenztypen für Objekte registrieren. Diese sind davon betroffen.
© 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.