Jeder Entwickler ist dem schon begegnet: Das Interface funktioniert zwar, Buttons lassen sich klicken, aber das Verhalten wirkt „hölzern”, die Logik ist nicht offensichtlich, und der Code verwandelt sich schnell in eine Sammlung zufälliger Signale und Slots.
Dieses Kapitel deckt auf, warum Buttons in Qt nicht einfach Click-Elemente sind, sondern vollwertige Teilnehmer der Interface-Architektur. Sie werden entdecken, wie derselbe Basismechanismus Buttons, Checkboxen und Radiobuttons steuert, und warum professionelle Entwickler die UI-Logik genau darum herum aufbauen.
Es werden die wichtigsten Funktionen von QAbstractButton, die Arbeit mit on/off– und tristate-Zuständen sowie praktische Techniken zur Gruppierung von Interface-Elementen gezeigt. Nur wenige Basis-Signale, aber Dutzende Anwendungsszenarien, die den Code sauberer und die Wartung einfacher machen.
Das Überspringen dieses Kapitels ist ein Risiko. Genau hier entsteht das Verständnis dafür, wie ein wirklich kontrollierbares Interface in Qt aussieht.
Das Kapitel enthält Code-Beispiele, die sofort einsatzbereit sind.
Selbsttest zum Kapitel
Welche Rolle erfüllt die Klasse QAbstractButton und warum erben alle Button-Typen davon?Antwort
Richtige Antwort: QAbstractButton ist eine Basisklasse, die gemeinsame Methoden und Funktionen für alle Button-Typen (QPushButton, QCheckBox, QRadioButton) implementiert, wie Text/Bild-Einstellung, Interaktions-Signale und Statusabfrage.
Was ist der fundamentale Unterschied zwischen den Methoden isDown() und isChecked()?Antwort
Richtige Antwort: isDown() gibt true zurück, wenn der Button physisch im Moment gedrückt ist, während isChecked() zurückgibt, ob der Button im eingeschalteten Zustand ist (für Toggle-Buttons, Checkboxen und Radiobuttons), der nach dem Loslassen erhalten bleibt.
Warum können Radiobuttons (QRadioButton) nicht einzeln verwendet werden und müssen gruppiert sein?Antwort
Richtige Antwort: Radiobuttons modellieren eine „Einer-von-Vielen”-Beziehung, bei der nur eine Option aus der Gruppe ausgewählt werden kann. Bei Auswahl eines Radiobuttons wird automatisch die Auswahl der anderen aufgehoben, was ihre Gruppierung erfordert.
Wozu braucht ein normaler QPushButton die Methode setCheckable(true) und was ändert sie?Antwort
Richtige Antwort: Diese Methode verwandelt einen normalen Button in einen Toggle Button (Schalter), der zwei Zustände speichern kann – gedrückt und nicht gedrückt, ähnlich einem Zimmerlichtschalter.
Wann wird das Signal toggled() gesendet und wie unterscheidet es sich grundsätzlich von clicked()?Antwort
Richtige Antwort: Das Signal toggled() wird bei Zustandsänderung des Toggle-Buttons (on/off) gesendet, während clicked() bei jedem Klick unabhängig von der Zustandsänderung gesendet wird. toggled() trägt Information über den neuen Zustand.
Was ist der Unterschied zwischen den Signalen pressed() und clicked(), und wann ist es wichtig, genau pressed() zu verwenden?Antwort
Richtige Antwort: pressed() wird sofort beim Drücken der Maustaste gesendet, während clicked() erst nach dem Loslassen auf demselben Button gesendet wird. pressed() ist wichtig für Echtzeit-Reaktionen oder lange Drückvorgänge.
Wozu brauchen Checkboxen (QCheckBox) einen dritten unbestimmten Zustand Qt::PartiallyChecked?Antwort
Richtige Antwort: Dieser Zustand wird zur Anzeige eines gemischten Zustands verwendet, z.B. wenn mehrere Dateien mit unterschiedlichen Attributen ausgewählt sind (wie im Windows-Eigenschaften-Dialog), oder für dreistufige Auswahl in Hierarchien.
Wie setzt man eine Checkbox programmgesteuert in den unbestimmten Zustand, und welche Methode muss vorher aufgerufen werden?Antwort
Richtige Antwort: Zuerst muss die Unterstützung für den dritten Zustand mit der Methode setTristate(true) aktiviert werden, dann den Zustand mit der Methode setCheckState(Qt::PartiallyChecked) setzen.
Warum wird für mehr als fünf Checkboxen oder Radiobuttons die Verwendung anderer Widgets empfohlen?Antwort
Richtige Antwort: Viele Checkboxen/Radiobuttons nehmen viel Platz auf dem Bildschirm ein. Für Checkboxen ist QListWidget besser, für Radiobuttons – QComboBox (Dropdown-Liste), wobei der Vorteil der Sichtbarkeit bei Platzeinsparung erhalten bleibt.
Welche Methode erstellt einen Button mit Popup-Menü und wo wird dies in modernen Interfaces verwendet?Antwort
Richtige Antwort: Die Methode setMenu() fügt ein QMenu-Objekt an den Button an. Beispiele – Start-Button in Windows 11, Buttons in Microsoft Edge. Dies ist eine Alternative zu Dropdown-Listen für kompakte Aktionsdarstellung.
Was passiert in einer QRadioButton-Gruppe, wenn der Programmierer keinen Radiobutton standardmäßig in den eingeschalteten Zustand setzt?Antwort
Richtige Antwort: Alle Radiobuttons werden ausgeschaltet, was die „Einer-von-Vielen”-Logik verletzt. Der Benutzer kann zwar einen auswählen, aber dies ist schlechte Praxis – immer sollte ein Radiobutton standardmäßig mit setChecked(true) aktiviert werden.
Welche Rolle spielt die Methode setFlat(true) für einen Button und wo kann dies nützlich sein?Antwort
Richtige Antwort: Die Methode macht den Button flach (die Konturen werden unsichtbar), wobei die Funktionalität erhalten bleibt. Nützlich zum Erstellen von „geheimen” Buttons, Icon-Buttons oder minimalistischen Interfaces.
Wozu dient die Klasse QGroupBox neben der visuellen Gruppierung, und welche technische Funktion erfüllt sie für QRadioButton?Antwort
Richtige Antwort: QGroupBox gruppiert nicht nur visuell Elemente, sondern schafft auch einen logischen Bereich, innerhalb dessen die sich gegenseitig ausschließende Radiobutton-Logik funktioniert. Kann auch eine Checkbox zur Steuerung der Verfügbarkeit der gesamten Gruppe und eine Zugriffstaste haben.
Praktische Aufgaben
Einfaches Niveau
Button-Steuerungs-Panel
Erstellen Sie eine Anwendung mit vier Buttons verschiedener Typen: normaler Button, Toggle Button, flacher Button und Button mit Icon. Bei Drücken des Toggle Buttons geben Sie seinen aktuellen Zustand (checked/unchecked) in der Konsole aus. Der normale Button sollte die Anwendung schließen.
Hinweise: Verwenden Sie setCheckable(true) zum Erstellen eines Toggle Buttons. Für den flachen Button – setFlat(true). Laden Sie ein Icon über QPixmap und setzen Sie es mit setIcon(). Verbinden Sie das Signal toggled(bool) mit einem Slot zur Statusausgabe.
Mittleres Niveau
Text-Anzeigeeinstellungen
Erstellen Sie ein Fenster mit einem QLabel, das Text anzeigt, und einem Einstellungs-Panel mit drei Checkboxen: “Fett”, “Kursiv”, “Unterstrichen”. Bei Änderung des Zustands einer Checkbox sollte der Text sofort aktualisiert werden. Fügen Sie eine Gruppe von drei Radiobuttons zur Auswahl der Schriftgröße hinzu: “Klein (10pt)”, “Mittel (14pt)”, “Groß (18pt)”.
Hinweise: Verwenden Sie QFont zur Verwaltung des Textstils. Methoden: setBold(), setItalic(), setUnderline(), setPointSize(). Verbinden Sie die Signale clicked() der Checkboxen und Radiobuttons mit einem Slot, der die Schrift aktualisiert. Wenden Sie setFont() auf QLabel an.
Komplexes Niveau
Rechner mit Modi
Erstellen Sie einen Rechner mit Buttons für Ziffern 0-9 und Operationen (+, -, *, /). Fügen Sie eine Radiobutton-Gruppe zur Modusauswahl hinzu: “Standard”, “Wissenschaftlich” (fügt Buttons sin, cos, sqrt hinzu), “Programmierer” (fügt Buttons AND, OR, XOR hinzu). Verwenden Sie QGroupBox mit Checkbox zum Ein-/Ausschalten des Operationsverlaufs. Bei ausgeschalteter Checkbox sollten alle Verlaufselemente unverfügbar werden.
Hinweise: Verwenden Sie QGridLayout zur Button-Platzierung. Erstellen Sie einen Slot zum dynamischen Hinzufügen/Entfernen von Buttons beim Moduswechsel. Für die QGroupBox-Checkbox verwenden Sie setCheckable(true) und das Signal toggled(bool). Verbinden Sie es mit setEnabled() für das Verlaufs-Widget. Speichern Sie die aktuelle Operation und das Ergebnis in Klassenvariablen.
💬 Zur Diskussion beitreten!
Verstanden, wann Checkboxen und wann Radiobuttons zu verwenden sind? Fragen zu Signalen toggled() vs clicked()?
Teilen Sie Ihre Lösungen zu praktischen Aufgaben, diskutieren Sie Nuancen der Button-Gruppierung oder stellen Sie Fragen zum Erstellen interaktiver Interfaces!