Kapitel 54. Elemente

Hatten Sie das Gefühl, dass QML „sein eigenes Leben lebt”? Sie haben scheinbar nur width geändert – und plötzlich „gerät alles durcheinander”: Positionierung, Größen, Sichtbarkeit, Event-Reaktionen. Jeder Entwickler kennt dieses frustrierende Gefühl unkontrollierter Magie.

Dieses Kapitel wird enthüllen, warum QML-Elemente tatsächlich vorhersagbar sind – und wie man „magische” Interfaces in steuerbare Systeme verwandelt. Hier werden Sie die unerwartete Kraft von Property-Bindings entdecken, die Logik von parent/id-Hierarchien aufdecken und das Geheimnis erfahren, wie professionelle Entwickler UIs flexibel machen ohne überflüssigen Code – schneller, sauberer und stabiler.

An einem Ort zusammengefasst: 7+ wichtige visuelle Elemente (von Item und Rectangle bis ListView/PathView), Property-Bindings und Reaktionen über onWidthChanged/onHeightChanged gezeigt, sowie 3 Praktiken, die Stunden sparen: property, alias und dynamische Erstellung über Repeater + Flickable.

Schieben Sie es nicht auf: Wenn QML im Projekt verwendet wird, garantiert das Auslassen dieses Kapitels fast unnötige Workarounds in den folgenden Kapiteln über Layout, Input und Models.

Das Kapitel enthält Code-Beispiele, die sofort einsatzbereit sind.

Selbsttest zum Kapitel

Warum ändern sich beim Ändern der Fenstergröße automatisch die Größen der untergeordneten Rechtecke im Beispiel mit Property-Binding?Antwort
Richtige Antwort: Es erfolgt automatisches Property-Binding: QML beobachtet Wertänderungen und benachrichtigt alle Elemente, die über parent.width oder Element-id auf diese Properties verweisen. Dies schafft ein reaktives System, in dem sich Änderungen entlang der Abhängigkeitskette ausbreiten.
Was ist der grundsätzliche Unterschied zwischen visuellen Elementen und Objekten in QML?Antwort
Richtige Antwort: Visuelle Elemente haben eine visuelle Darstellung auf dem Bildschirm (Rectangle, Text, Image), während Objekte keine visuelle Darstellung haben und unterstützende Rollen erfüllen (Timer, Loader, Connections).
Was ist ein Alias und warum sollte man ihn beim Erstellen eigener Elemente verwenden?Antwort
Richtige Antwort: Ein Alias ermöglicht es, Properties verschachtelter Elemente unter einem anderen Namen auf einer höheren Hierarchieebene zu veröffentlichen. Dies macht interne Properties von außen änderbar, z.B.: property alias text: txt.text.
Warum benötigt die Property width eines Top-Level-Elements keinen Alias, während die Property text eines verschachtelten Text-Elements einen benötigt?Antwort
Richtige Antwort: Properties des Top-Level-Elements sind bereits von außen direkt zugänglich. Aliase werden nur für Properties verschachtelter (untergeordneter) Elemente benötigt, um sie auf Ebene des Eltern-Elements zugänglich zu machen.
Welche Anforderungen werden an Identifier-Namen (Property id) gestellt?Antwort
Richtige Antwort: Namen müssen mit einem Kleinbuchstaben oder Unterstrich beginnen und dürfen nur Buchstaben, Zahlen und Unterstriche enthalten.
Wie funktioniert der Property-Watching-Mechanismus und welche speziellen Properties werden dabei erstellt?Antwort
Richtige Antwort: QML beobachtet Property-Änderungen und erstellt automatisch spezielle Properties der Form onX (z.B. onWidthChanged, onHeightChanged), die bei jeder Änderung der entsprechenden Property ausgelöst werden.
Wozu wird QtObject zum Deklarieren von Properties innerhalb eines Elements verwendet?Antwort
Richtige Antwort: QtObject ermöglicht es, Daten zu kapseln und vor externem Zugriff zu verbergen, indem private Properties erstellt werden. Der Zugriff ist nur über den QtObject-Identifier innerhalb des Elements möglich.
Was passiert, wenn man versucht, zwei Elemente mit derselben id in einer QML-Datei zu erstellen?Antwort
Richtige Antwort: Dies führt zu einem Fehler, da Identifier innerhalb einer QML-Datei eindeutig sein müssen. QML verwendet id, um eindeutige Referenzen auf Elemente zu erstellen.
Wann sollte das Element Repeater anstelle manueller Element-Erstellung verwendet werden?Antwort
Richtige Antwort: Repeater wird für die dynamische Erstellung vieler gleichartiger Elemente basierend auf einem Datenmodell (Zahl, Array, JSON) benötigt, was den Code kompakt und lesbar macht und Duplizierung vermeidet.
Wie organisiert man Dateien korrekt, um ein eigenes QML-Modul zu erstellen, und was sollte in der Datei qmldir stehen?Antwort
Richtige Antwort: Man muss ein Verzeichnis mit QML-Dateien der Elemente erstellen und eine qmldir-Datei mit Angabe des Modulnamens, Elementnamen, deren Versionen und Dateinamen hinzufügen. Neuere Versionen werden über früheren angegeben.
Wie ähnelt das Element Flickable der Klasse QScrollArea von Qt und was ist seine Besonderheit?Antwort
Richtige Antwort: Beide sind für die Anzeige von Inhalten gedacht, deren Größe den Anzeigebereich übersteigt. Die Besonderheit von Flickable ist die Unterstützung von Touch-Steuerung mit Animations- und Trägheitseffekt beim Verschieben.
Wie verbindet man den Wert einer ProgressBar mit einem Dial-Element für synchrone Änderungen?Antwort
Richtige Antwort: Dem Dial-Element einen Identifier zuweisen (z.B. slider), dann Properties verbinden: value: slider.value für ProgressBar. Änderungen im Dial werden automatisch in der ProgressBar über den Binding-Mechanismus reflektiert.
Was ist der Unterschied zwischen modalem und nicht-modalem Dialogfenster und wie wird das festgelegt?Antwort
Richtige Antwort: Ein modales Fenster blockiert die Interaktion mit dem Hauptfenster (modality: Qt.WindowModal), ein nicht-modales erlaubt die gleichzeitige Arbeit mit beiden Fenstern (modality: Qt.NonModal).

Praktische Aufgaben

Einfaches Level

Größenrechner mit Synchronisation
Erstellen Sie eine QML-Anwendung mit drei verschiedenfarbigen Rechtecken. Das erste Rechteck sollte das gesamte Fenster ausfüllen. Das zweite – die halbe Breite und Höhe des ersten. Das dritte – die halbe Größe des zweiten. Alle Größen sollten sich automatisch bei Änderung der Fenstergröße neu berechnen. Fügen Sie Text-Elemente hinzu, die die aktuellen Größen jedes Rechtecks anzeigen.
Hinweise: Verwenden Sie Property-Binding über parent.width und parent.height. Weisen Sie jedem Rechteck eine id für Referenzen zu. Platzieren Sie Text-Elemente innerhalb der Rechtecke. Verwenden Sie die Properties onWidthChanged und onHeightChanged für Debugging in der Konsole.

Mittleres Level

Erstellung einer eigenen Button-Komponente
Erstellen Sie ein eigenes CustomButton.qml-Element, das einen Button mit abgerundeten Ecken, Rahmen und zentriertem Text darstellt. Das Element sollte eigene Properties für Hintergrundfarbe, Textfarbe, Rahmengröße und Abrundungsradius haben. Fügen Sie ein property alias für den Button-Text und ein clicked-Signal hinzu. Verwenden Sie ein MouseArea-Element für Klick-Behandlung. Erstellen Sie eine Hauptanwendung mit drei Instanzen Ihres Buttons mit unterschiedlichen Erscheinungseinstellungen.
Hinweise: Basieren Sie auf dem Rectangle-Element. Verwenden Sie property zur Erstellung anpassbarer Properties (z.B. property color buttonColor). Wenden Sie property alias für die Verbindung mit dem internen Text an. Fügen Sie signal clicked() hinzu und rufen Sie es aus MouseArea.onClicked auf. Zentrieren Sie das Text-Element über anchors.centerIn: parent.

Schwieriges Level

Dynamische Galerie mit Steuerelementen
Erstellen Sie eine Bildergalerie-Anwendung mit Repeater und Flickable. Die Galerie sollte dynamisch 10 farbige Rechtecke mit Nummern generieren. Fügen Sie ein Bedienfeld mit Slider-Elementen (zum Ändern der Elementgröße), SpinBox (für die Anzahl der Elemente), ComboBox (zur Auswahl des Anordnungstyps: Grid oder Flow) hinzu. Bei Änderung der Einstellungen sollte die Galerie neu aufgebaut werden. Fügen Sie einen ColorDialog zur Auswahl der Hintergrundfarbe der Galerieelemente und ein Label am unteren Fensterrand zur Anzeige der aktuellen Einstellungen hinzu.
Hinweise: Verwenden Sie Flickable als Container für Repeater. Machen Sie das Repeater-Model dynamisch über property int itemCount. Verbinden Sie die Elementgröße mit dem Slider-Wert. Verwenden Sie Grid mit columns-Properties oder Flow. Zum Umschalten des Anordnungstyps verwenden Sie Loader mit sourceComponent. Erstellen Sie separate Components für Grid- und Flow-Varianten. Verwenden Sie Qt.createComponent() oder einen bedingten Operator zum Wechseln der Komponente.

💬 Treten Sie der Diskussion bei!

Haben Sie QML-Elemente und den Property-Binding-Mechanismus verstanden? Ihre erste eigene Komponente erstellt?

Vielleicht haben Sie Fragen dazu, wann Aliase verwendet werden sollten, wie man die Element-Hierarchie richtig organisiert, oder Sie haben eine interessante Anwendung von Repeater gefunden?

Teilen Sie Ihre Erfahrung beim Erstellen eigener Elemente, zeigen Sie implementierte Projekte oder stellen Sie Fragen zu Modulen und fertigen QtQuick.Controls-Komponenten!

Leave a Reply

Your email address will not be published. Required fields are marked *