QML-Werttypen und Sequenzreferenzen
QML Value Types und QML Sequence Types werden notwendigerweise als Wert übergeben. Im Gegensatz zu QML Object Types haben sie keine eigene Identität, sondern können nur als Eigenschaften anderer Objekte oder Werte oder als von Methoden zurückgegebene Werte angesprochen werden. Jeder solche Zugriff erzeugt implizit eine Kopie. In JavaScript ist jedoch alles ein Objekt. Es gibt kein Konzept wie einen Wertetyp in JavaScript. Wenn Sie zum Beispiel 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 Codeschnipsel:
import QtQuick Text { onSomethingHappened: font.bold = true }
In diesem Fall wissen wir, dass font
ein Werttyp ist. Der Zugriff darauf erzeugt eine lokale Kopie, indem er den Getter von Q_PROPERTY aufruft. Wir können dann die Eigenschaft bold
darauf setzen, aber das würde normalerweise nur die Kopie betreffen, nicht das Original Q_PROPERTY.
Um dieses Problem zu lösen, bietet QML das Konzept der Referenzen. Wenn Sie eine Instanz eines Wertes oder Sequenztyps von einer Eigenschaft abrufen, merkt sich die QML-Engine die Eigenschaft zusammen mit dem Wert selbst. Wenn der Wert geändert wird, wird er in die Eigenschaft zurückgeschrieben. Dadurch entsteht die Illusion eines Objekts mit eigener Identität, und der obige Fall und viele andere funktionieren einfach.
Dies kann jedoch ziemlich teuer sein. Wenn eine Sequenz als Q_PROPERTY offengelegt wird, führt der Zugriff auf einen beliebigen Wert in der Sequenz per Index dazu, dass die gesamten Sequenzdaten aus der Eigenschaft gelesen werden. Aus diesen Sequenzdaten wird dann ein einzelnes Element abgerufen. In ähnlicher Weise führt das Ändern eines beliebigen Wertes in der Sequenz dazu, dass die Sequenzdaten gelesen werden. Dann wird die Änderung durchgeführt und die geänderte Sequenz in die Eigenschaft zurückgeschrieben. Ein Lesevorgang kann relativ kostengünstig sein, wenn der betreffende Typ implizit freigegeben ist. Bei einer Änderung wird immer mindestens eine tiefe Kopie erstellt.
Wenn Sie eine Instanz eines Sequenz- oder Werttyps aus einer Q_INVOKABLE Funktion zurückgeben, vermeiden Sie diesen Overhead. Rückgabewerte sind nicht an eine Eigenschaft gebunden und werden nicht zurückgeschrieben.
Sequenzen von Objekttypen werden standardmäßig als QQmlListProperty übergeben. QQmlListProperty ist kein tatsächlicher Container, sondern nur eine Ansicht oder ein Verweis auf einen sequentiellen Speicher. Daher ist QQmlListProperty von diesem Effekt nicht betroffen. Sie können jedoch andere Sequenztypen für Objekte mit QML_SEQUENTIAL_CONTAINER registrieren. Diese werden davon betroffen sein.
© 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.