QML-Codierungskonventionen
Dieses Dokument enthält die QML-Codierungskonventionen, an die wir uns in unserer Dokumentation und unseren Beispielen halten und deren Einhaltung wir auch anderen empfehlen.
QML-Objektdeklarationen
In unserer gesamten Dokumentation und unseren Beispielen sind die Attribute von QML-Objekten stets in der folgenden Reihenfolge angeordnet:
- id
- Eigenschaftsdeklarationen
- Signaldeklarationen
- JavaScript-Funktionen
- Objekteigenschaften
- untergeordnete Objekte
Zur besseren Lesbarkeit trennen wir diese verschiedenen Teile durch eine Leerzeile.
Ein hypothetisches QML-Objekt für ein Foto würde beispielsweise so aussehen:
Rectangle {
id: photo // id on the first line makes it easy to find an object
property bool thumbnail: false // property declarations
property alias image: photoImage.source
signal clicked // signal declarations
function doSomething(x) // javascript functions
{
return x + photoImage.width;
}
color: "gray" // object properties
x: 20 // try to group related properties together
y: 20
height: 150
width: { // large bindings
if (photoImage.width > 200) {
photoImage.width;
} else {
200;
}
}
states: [
State {
name: "selected"
PropertyChanges { target: border; color: "red" }
}
]
transitions: [
Transition {
from: ""
to: "selected"
ColorAnimation { target: border; duration: 200 }
}
]
Rectangle { // child objects
id: border
anchors.centerIn: parent
color: "white"
Image {
id: photoImage
anchors.centerIn: parent
}
}
}Gruppierte Eigenschaften
Wenn Sie mehrere Eigenschaften aus einer Gruppe von Eigenschaften verwenden, sollten Sie die Gruppennotation anstelle der Punktnotation in Betracht ziehen, sofern dies die Lesbarkeit verbessert.
Beispielsweise könnte dies:
Rectangle {
anchors.left: parent.left; anchors.top: parent.top; anchors.right: parent.right; anchors.leftMargin: 20
}
Text {
text: "hello"
font.bold: true; font.italic: true; font.pixelSize: 20; font.capitalization: Font.AllUppercase
}könnte wie folgt geschrieben werden:
Rectangle {
anchors { left: parent.left; top: parent.top; right: parent.right; leftMargin: 20 }
}
Text {
text: "hello"
font { bold: true; italic: true; pixelSize: 20; capitalization: Font.AllUppercase }
}Unqualifizierter Zugriff
Um die Lesbarkeit und Leistung zu verbessern, sollten Sie Eigenschaften von übergeordneten Komponenten stets explizit über deren ID referenzieren:
Erforderliche Eigenschaften
Wenn Daten benötigt werden, die außerhalb der Komponente definiert sind, machen Sie dies durch die Verwendung von „Erforderliche Eigenschaften“ explizit. Erforderliche Eigenschaften müssen gesetzt werden, andernfalls schlägt die Erstellung der Komponente fehl. Diese sind unqualifizierten Abfragen vorzuziehen, da sie leistungsfähiger sind und es sowohl Benutzern als auch Tools ermöglichen, den Typ einer externen Eigenschaft zu ermitteln. Zudem beseitigen sie Annahmen, die eine Komponente andernfalls über die Umgebung treffen müsste, in der sie erstellt wird.
Signal-Handler
Verwenden Sie bei der Verarbeitung von Parametern in Signal-Handlern Funktionen, die diese explizit benennen:
MouseArea {
onClicked: event => { console.log(`${event.x},${event.y}`); }
}JavaScript-Code
Zur besseren Lesbarkeit und Wartbarkeit deklarieren wir jede Eigenschaft in der Regel in einer eigenen Zeile, selbst bei einfachen Ausdrücken.
Rectangle {
color: "blue"
width: parent.width / 3
}Bei Skript-Ausdrücken, die sich über mehrere Zeilen erstrecken, verwenden wir ein Blockformat:
Rectangle {
color: "blue"
width: {
var w = parent.width / 3;
console.debug(w);
return w;
}
}Wenn das Skript mehr als ein paar Zeilen lang ist oder von verschiedenen Objekten verwendet werden kann, empfehlen wir, eine Funktion zu erstellen und diese wie folgt aufzurufen:
function calculateWidth(object : Item) : double
{
var w = object.width / 3;
// ...
// more javascript code
// ...
console.debug(w);
return w;
}
Rectangle {
color: "blue"
width: calculateWidth(parent)
}Beachten Sie außerdem, dass es empfehlenswert ist, Ihrer Funktion Typangaben hinzuzufügen, um die Anwendung leichter zu verstehen und umzugestalten, da sowohl die Parameter- als auch die Rückgabetypen direkt aus der Funktionssignatur ersichtlich sind.
Bei langen Skripten legen wir die Funktionen in einer eigenen JavaScript-Datei ab und importieren sie wie folgt:
import "myscript.js" as Script
Rectangle { color: "blue"; width: Script.calculateWidth(parent) }Wenn der Code länger als eine Zeile ist und somit in einem Block steht, verwenden wir Semikolons, um das Ende jeder Anweisung zu kennzeichnen:
MouseArea {
anchors.fill: parent
onClicked: event => {
var scenePos = mapToItem(null, event.x, event.y);
console.log("MouseArea was clicked at scene pos " + scenePos);
}
}© 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.