Kapitel 10. Eingabeelemente

Sind Sie schon auf die Situation gestoßen, wo der Benutzer „beliebig eintippt” und die Anwendung dann an Fehlern, seltsamen Werten und endlosen Handlern scheitert? Jeder Qt-Entwickler kennt dieses Gefühl: Das Interface ist schon fertig, aber die Dateneingabe wird zum Minenfeld.

Dieses Kapitel wird aufdecken, wie man Eingabe in einen kontrollierten Prozess verwandelt: sauber, vorhersehbar und benutzerfreundlich. Hier werden Sie einen nicht offensichtlichen Insight entdecken: Viele Eingabe-Aufgaben (Zwischenablage, Drag & Drop, Auswahl, Undo/Redo) sind von Qt bereits gelöst – man muss sie nur richtig „einschalten” und nicht das Rad neu erfinden. Das Ergebnis – weniger Code, weniger Bugs, schnellere Entwicklung.

Im Fokus – die Verbindung QLineEdit + Signale textChanged/textEdited, Password-Modus, „intelligente” Einschränkungen über QValidator, sowie Arbeit mit dem Dokument über QTextEdit/QTextDocument (einschließlich Export nach ODF/HTML und Druck in PDF über QPrinter). Plus – praktische Aufschlüsselung von QSyntaxHighlighter: Warum professionelle Entwickler Syntax-Highlighting selbst in Utilities verwenden.

Nicht aufschieben: Eine falsche Eingabe-Strategie taucht meist schon beim ersten Release auf – und die Reparatur kostet mehr als der richtige Start.

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

Selbsttest zum Kapitel

Was ist der Hauptunterschied zwischen den Signalen textChanged() und textEdited() in QLineEdit?Antwort
Richtige Antwort: textChanged() wird bei jeder Textänderung gesendet (einschließlich programmatischer über setText()), während textEdited() nur bei manuellen Benutzeränderungen gesendet wird.
Warum wird für die Bearbeitung von Plain Text QPlainTextEdit statt QTextEdit empfohlen?Antwort
Richtige Antwort: QPlainTextEdit unterstützt keine RTF-Formatierung, was es leichtgewichtiger, einfacher und effizienter für die Arbeit mit Plain Text macht.
Welche Rolle spielt das Objekt QTextDocument in Text-Editing-Widgets?Antwort
Richtige Antwort: QTextDocument speichert den Dokumentinhalt und bietet Methoden zur Arbeit damit (undo/redo, Suche, Formatierung); viele QTextEdit-Methoden delegieren an QTextDocument.
Warum wird im Beispiel mit Syntax-Highlighting kein Zeiger auf das SyntaxHighlighter-Objekt nach seiner Erstellung gespeichert?Antwort
Richtige Antwort: Das SyntaxHighlighter-Objekt setzt automatisch QTextDocument als Elternteil, das seine Speicherverwaltung übernimmt und es automatisch bei seiner Zerstörung löscht.
Wozu werden im Syntax-Highlighting-Beispiel die Zustände InsideCStyleComment und InsideCString verwendet?Antwort
Richtige Antwort: Die Methode highlightBlock() verarbeitet nur eine Zeile auf einmal, daher sind Zustände erforderlich, um mehrzeilige Konstrukte (Kommentare /**/ und Strings) zu verfolgen, die in einer Zeile beginnen und in einer anderen enden können.
Welche drei Werte kann die Methode validate() zurückgeben und wann wird jeder verwendet?Antwort
Richtige Antwort: Invalid – String kann nicht akzeptiert werden; Intermediate – String ist nicht endgültig (z.B. “1” bei Bereich 50-100); Acceptable – String ist korrekt und kann akzeptiert werden.
Wozu wird der Zustand Intermediate im Validator benötigt, wenn es Invalid und Acceptable gibt?Antwort
Richtige Antwort: Intermediate erlaubt dem Benutzer, Zwischenwerte während der Eingabe einzugeben (z.B. wird bei Eingabe von “100” zuerst “1” eingegeben), ohne die Eingabe vorzeitig zu blockieren.
Wie erstellt man eine PDF-Datei aus QTextEdit-Inhalt ohne QTextDocumentWriter zu verwenden?Antwort
Richtige Antwort: Man muss ein QPrinter-Objekt mit hochauflösendem Modus erstellen, PdfFormat-Format setzen, Dateinamen angeben und die Methode document()->print(&printer) aufrufen.
In welchen Situationen ist es besser, setReadOnly(true) statt eines Validators zu verwenden?Antwort
Richtige Antwort: setReadOnly() eignet sich, wenn Bearbeitung komplett verboten und nur Ansicht belassen werden soll; der Validator wird zur Formatsteuerung eingegebener Daten bei erlaubter Bearbeitung verwendet.
Warum funktioniert die Methode append() in QTextEdit schneller und benötigt weniger Speicher als insertPlainText()?Antwort
Richtige Antwort: Über append() hinzugefügter Text wird nicht in die Operationsliste für undo() aufgenommen, was die Notwendigkeit ausschließt, Änderungshistorie für diese Operation zu speichern.
Welche fertigen Validator-Klassen bietet Qt und wofür werden sie verwendet?Antwort
Richtige Antwort: QIntValidator und QDoubleValidator zur Überprüfung der Eingabe ganzer Zahlen bzw. Gleitkommazahlen; QRegularExpressionValidator zur Validierung mittels regulärer Ausdrücke.

Praktische Aufgaben

Einfaches Niveau

Registrierungsformular mit Validierung
Erstellen Sie ein einfaches Registrierungsformular mit drei Feldern: Benutzername (nur Buchstaben), E-Mail und Passwort (versteckte Eingabe). Fügen Sie ein Label hinzu, das anzeigt, wie viele Zeichen im Namensfeld eingegeben wurden. Implementieren Sie einen eigenen Validator für das Namensfeld, der die Eingabe von Ziffern und Sonderzeichen verbietet.
Hinweise: Verwenden Sie QLineEdit für Eingabefelder. Für Passwort wenden Sie setEchoMode(QLineEdit::Password) an. Erstellen Sie eine von QValidator abgeleitete Validator-Klasse und prüfen Sie Zeichen mit QString::contains() und regulären Ausdrücken. Verbinden Sie das Signal textChanged() mit einem Slot zur Aktualisierung des Zeichen-Zählers.

Mittleres Niveau

Einfacher Text-Editor mit Formatierung
Erstellen Sie einen Text-Editor basierend auf QTextEdit mit einer Werkzeugleiste, die Buttons enthält für: Speichern in HTML und PDF, Text löschen, Undo/Redo, Schriftgröße vergrößern/verkleinern. Fügen Sie einen Wortzähler hinzu, der sich bei Textänderung aktualisiert. Implementieren Sie die Möglichkeit, einfache HTML-Dateien zu öffnen und anzuzeigen.
Hinweise: Verwenden Sie QVBoxLayout für Layout. Erstellen Sie QHBoxLayout für Buttons. Für PDF-Speicherung verwenden Sie QPrinter mit setOutputFormat(QPrinter::PdfFormat). Verbinden Sie Signale undoAvailable/redoAvailable zur Steuerung der Button-Aktivität. Für Wortzählung verwenden Sie toPlainText().split(QRegularExpression(“\\s+”), Qt::SkipEmptyParts).count().

Komplexes Niveau

Editor mit JSON-Syntax-Highlighting
Erstellen Sie einen Editor für JSON-Dateien mit eigenem Syntax-Highlighting. Implementieren Sie QSyntaxHighlighter, der färbt: Schlüssel (blau), String-Werte (grün), Zahlen (orange), boolesche Werte und null (violett), geschweifte und eckige Klammern (fett). Fügen Sie Echtzeit-JSON-Validierung hinzu – bei Eingabe von falschem JSON zeigen Sie einen Fehler-Indikator an und heben die problematische Zeile mit rotem Hintergrund hervor.
Hinweise: Erben Sie von QSyntaxHighlighter und implementieren Sie highlightBlock(). Verwenden Sie reguläre Ausdrücke zur Mustersuche: Schlüssel (“.*”:), Strings (“.*”), Zahlen (\b\d+\.?\d*\b). Für Validierung verwenden Sie QJsonDocument::fromJson() und prüfen Sie auf Parse-Fehler. Wenden Sie setFormat() mit QTextCharFormat zum Hintergrund-Highlighting problematischer Zeilen an. Verwenden Sie previousBlockState() zum Verfolgen mehrzeiliger Strings.

💬 Zur Diskussion beitreten!

Eingabe-Elemente und Validierung gemeistert? Eigenes Syntax-Highlighting implementiert?

Teilen Sie Ihre Erkenntnisse zur Arbeit mit QTextEdit, berichten Sie über Schwierigkeiten mit Validatoren oder stellen Sie Fragen zum Syntax-Highlighting!

Vielleicht haben Sie eine elegantere Lösung für den Färbungsalgorithmus gefunden oder eine interessante Anwendung von QSyntaxHighlighter?

Leave a Reply

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