Nun geht es an die Integration in das Qt-Quick-Framework. Dazu verschaffen wir uns mit Listing 2 einen kurzen Überblick über die Grundlagen der QML-Programmierung.
Listing 2
Rectangle {
id: root
width: 300
height: 350
color: "blue"
Rectangle {
id: firstInnerRectangle
anchors.left: parent.left
anchors.top: parent.top
width: parent.width / 2
height: parent.height / 2
color: "green"
opacity: 0.9
}
Rectangle {
id: secondInnerRectangle
anchors.right: parent.right
anchors.bottom: parent.bottom
width: parent.width / 2
height: parent.height / 2
color: "yellow"
}
}
Das Beispiel erstellt drei Rechtecke: ein blaues Rechteck sowie ein grünes und ein gelbes, die sich innerhalb des blauen Rechtecks befinden. Die Syntax ist an JSON angelegt. Beim Setzen der Eigenschaften (Properties) für die Rechtecke - etwa Breite, Höhe, Farbe und Opazität - kann der Entwickler konkrete Werte angeben, sich allerdings auch auf andere Rechtecke beziehen. Die inneren Rechtecke sind hier halb so groß wie das äußere. Ändert sich die Größe des äußeren Rechtecks (des Parents), werden auch die Werte der inneren Rechtecke aktualisiert. QML-Entwickler sprechen von Property-Bindings. Die verwendeten Anchors helfen, Qt-Quick-Elemente an den Rändern anderer Elemente zu layouten.
Beim Rendern der Szene passiert nun folgendes: zunächst wird die QML-Hierarchie von der Qt-Quick-Logik in eine zweite Hierarchie überführt, den sogenannten SceneGraph.
Dieser wird vom Renderer auf die Anforderungen moderner Grafikhardware hin optimiert und kann in OpenGL-Kommandos (oder Kommandos anderer Grafik-APIs) ausgerollt werden (Bild 1). Die Transform-Nodes im SceneGraph codieren affine Transformationen in einer 4x4-Matrix. Die Geometry-Nodes verwalten die Geometrie-Buffer, die später beispielsweise als verkettete Dreiecke (Triangle-Strips), Linienzüge oder Punktwolken gezeichnet werden. Außerdem definieren sie ein Material, das angibt, wie die Geometrien schattiert werden sollen.