Kapitel 5. Womit beginnen Steuerelemente?

Jeder Entwickler hatte diesen Moment: Das Interface ist fast fertig, aber verhält sich “seltsam” – Elemente überlappen sich, reagieren nicht auf Events oder verschwinden plötzlich. Wo genau bricht die GUI-Logik und warum funktionieren gewohnte Techniken nicht mehr?

Dieses Kapitel offenbart sorgfältig das verborgene Fundament von Qt-Interfaces. Hier werden Sie herausfinden, warum ein Widget nicht nur ein Button oder Fenster ist, sondern ein vollwertiges Objekt mit Verhalten, und Sie erfahren das Geheimnis, das professionelle Entwickler für den Aufbau skalierbarer und vorhersagbarer GUIs nutzen. Der “Vorher/Nachher”-Kontrast wird besonders deutlich: Interfaces hören auf, eine Sammlung chaotischer Elemente zu sein und verwandeln sich in ein verwaltetes System.

Im Kapitel werden zwei verschiedene Qt-Hierarchien behandelt, gezeigt, wie dasselbe Widget ein Container sein kann, 3 Schlüsselmethoden der Geometrieverwaltung besprochen und demonstriert, wie durch den Backing-Store-Mechanismus die Interface-Reaktionsfähigkeit ohne komplexe Optimierung verbessert werden kann. Auch Stacked Widgets, Frames und Scroll-Areas werden erwähnt – genau so viel, um Lust auf mehr zu machen.

Dieses Kapitel zu überspringen bedeutet, für immer im Modus “warum funktioniert das so?” zu bleiben.

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

Selbsttest zum Kapitel

Was ist der fundamentale Unterschied zwischen Klassenhierarchie und Objekthierarchie in Qt?Antwort
Richtige Antwort: Klassenhierarchie ist Vererbung (QPushButton erbt von QAbstractButton), während Objekthierarchie Parent-Child-Beziehungen zwischen Objekten ist (Button wird im Fenster platziert und gehört ihm).
Warum bleibt ein Top-Level-Widget auch nach der Erstellung unsichtbar, und was muss getan werden?Antwort
Richtige Antwort: Nach der Erstellung eines Top-Level-Widgets muss unbedingt die show()-Methode aufgerufen werden, sonst bleiben sowohl das Fenster selbst als auch alle Child-Widgets unsichtbar.
Wozu dient die Eigenschaft autoFillBackground und was passiert, wenn sie nicht auf true gesetzt wird?Antwort
Richtige Antwort: Standardmäßig ist diese Eigenschaft false, wodurch das Widget nicht mit Hintergrund gefüllt wird und unsichtbar bleibt. Das Setzen auf true zwingt das Widget, den Hintergrund automatisch zu füllen und macht es sichtbar.
Wie erhöht die Backing-Store-Technik die Anwendungsperformance?Antwort
Richtige Antwort: Die Technik speichert Rasterbilder von Widgets im Speicher, was schnelles Anzeigen ohne Aufruf von Paint-Events ermöglicht und die Interface-Aktualisierung erheblich beschleunigt.
Was passiert mit Child-Widgets, wenn ein Parent-Widget unavailable oder invisible wird?Antwort
Richtige Antwort: Child-Widgets übernehmen automatisch den Parent-Status – werden zusammen mit ihm unavailable oder invisible, was die Verwaltung von Widget-Gruppen vereinfacht.
Wozu dient Qt::WindowStaysOnTopHint bei der Fenstererstellung?Antwort
Richtige Antwort: Dieses Flag empfiehlt dem System, das Fenster immer im Vordergrund zu halten und nicht von anderen Fenstern überdecken zu lassen – nützlich für wichtige Benachrichtigungen oder Toolbars.
Wann und warum sollte setOverrideCursor() aufgerufen werden?Antwort
Richtige Antwort: Bei Ausführung langwieriger Operationen setzt dies einen Warte-Cursor für die gesamte Anwendung und informiert den Benutzer, dass die Anwendung beschäftigt ist und vorübergehend nicht auf Befehle reagiert.
Warum gibt es in Qt keine Trennung zwischen Controls und Containern?Antwort
Richtige Antwort: Jedes Widget kann dank der Objekthierarchie als Container für andere Widgets dienen, was Flexibilität und Einheitlichkeit beim Interface-Aufbau gewährleistet.
In welchem Fall entspricht der Aufruf setGeometry(5, 5, 260, 330) zwei separaten Methodenaufrufen?Antwort
Richtige Antwort: Er entspricht aufeinanderfolgenden Aufrufen von move(5, 5) und resize(260, 330) und ermöglicht gleichzeitiges Setzen von Position und Größe des Widgets.
Was macht die setWidget()-Methode der QScrollArea-Klasse mit dem übergebenen Widget?Antwort
Richtige Antwort: Diese Methode macht das übergebene Widget automatisch zum Child des Viewport-Widgets in der Objekthierarchie und fügt es zum Scroll-Fenster hinzu.
Warum zeigt QStackedWidget zu jedem Zeitpunkt nur ein Child an?Antwort
Richtige Antwort: Das ist sein Hauptzweck – mehrere Widgets so zu organisieren, dass nur eines zu einer bestimmten Zeit sichtbar ist, was für mehrseitige Interfaces oder Wizards nützlich ist.
Wie erstellt man ein eigenes Mauszeigerbild und was wird dafür benötigt?Antwort
Richtige Antwort: Man kann ein QPixmap-Objekt mit einer PNG-Datei verwenden, die Bild und Bitmaske enthält, es an den QCursor-Konstruktor übergeben und dann über setCursor() setzen.
Was passiert, wenn ein Widget ohne Übergabe des Parent-Parameters im Konstruktor erstellt wird?Antwort
Richtige Antwort: Das Widget wird ein Top-Level-Widget mit eigenem Fenster, da der pwgtParent-Parameter standardmäßig nullptr ist.
Warum muss beim Setzen des Widget-Hintergrunds zuerst ein QPalette-Objekt erstellt werden?Antwort
Richtige Antwort: Die Palette ermöglicht das Setzen des Widget-Hintergrunds (Farbe oder Bild) über setColor()- oder setBrush()-Methoden, wonach die Palette mit setPalette() auf das Widget angewendet wird.
Wann fügt QScrollArea automatisch Scrollbars hinzu?Antwort
Richtige Antwort: Scrollbars erscheinen automatisch, wenn mindestens ein Child-Widget über die Viewport-Grenzen hinausgeht und ermöglichen das Verschieben versteckter Teile in den sichtbaren Bereich.

Praktische Aufgaben

Einfaches Level

Farbige Widgets mit verschiedenen Hintergründen
Erstellen Sie eine Qt-Anwendung mit einem Top-Level-Widget, in dem drei Child-Widgets platziert sind. Setzen Sie für jedes eine eigene Hintergrundfarbe (rot, grün, blau), positionieren Sie sie so, dass sie sich teilweise überlappen und eine interessante Komposition bilden. Das Hauptfenster soll den Titel “Farbpalette” haben.
Hinweise: Erstellen Sie QPalette-Objekte für jedes Child-Widget. Verwenden Sie setColor() mit Qt::blue, Qt::red, Qt::green. Vergessen Sie nicht setAutoFillBackground(true) für jedes Widget. Verwenden Sie move() und resize() zur Positionierung.

Mittleres Level

Bildergalerie mit Scroll
Erstellen Sie eine Galerieanwendung, die mehrere Bilder (3-5 Stück) vertikal in einer QScrollArea anzeigt. Jedes Bild soll in einem separaten QLabel sein. Implementieren Sie Funktionalität, bei der Scrollbars immer sichtbar sind. Fügen Sie einen Frame (QFrame) um die gesamte Galerie mit Sunken-Effekt hinzu.
Hinweise: Verwenden Sie QVBoxLayout für vertikale Platzierung von QLabel mit Bildern. Setzen Sie ScrollBarAlwaysOn für beide Scrollbars. Wickeln Sie den Inhalt in QFrame und verwenden Sie setFrameStyle(QFrame::Box | QFrame::Sunken). Zum Laden von Bildern verwenden Sie QPixmap.

Fortgeschrittenes Level

Mehrseitiger Einstellungs-Wizard
Erstellen Sie eine Wizard-Anwendung mit drei Einstellungsseiten unter Verwendung von QStackedWidget. Erste Seite – Willkommenstext, zweite – Theme-Auswahl (hell/dunkel) über Buttons, dritte – Abschluss. Fügen Sie “Zurück”- und “Weiter”-Buttons für die Navigation zwischen Seiten hinzu. Bei Auswahl des dunklen Themes ändern Sie den Hintergrund der gesamten Anwendung. Implementieren Sie die Cursor-Änderung zu PointingHandCursor beim Hovern über Navigations-Buttons.
Hinweise: Verwenden Sie QStackedWidget::setCurrentIndex() zum Seitenwechsel. Erstellen Sie Slots für Button-Klick-Behandlung. Für Theme-Wechsel verwenden Sie QPalette mit setColor() für den Hintergrund. Überschreiben Sie enterEvent() für Buttons, um den Cursor über setCursor() zu ändern. Speichern Sie den aktuellen Seitenindex in einer Klassenvariable.

💬 Beteiligen Sie sich an der Diskussion!

Das Konzept der Widgets und ihrer Hierarchie verstanden? Fragen zu den Unterschieden zwischen Klassenhierarchie und Objekthierarchie aufgetaucht?

Vielleicht haben Sie eine elegante Methode zur Arbeit mit Paletten gefunden oder einen ungewöhnlichen benutzerdefinierten Cursor erstellt?

Teilen Sie Ihre Erfahrungen, stellen Sie Fragen oder helfen Sie anderen Lesern, die fundamentalen Qt-Konzepte zu meistern!

Leave a Reply

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