Kapitel 20. Arbeiten mit Schriftarten

Jeder Entwickler kennt das: Text im Interface „schwimmt”, wird abgeschnitten, sieht auf verschiedenen Plattformen unterschiedlich aus oder bricht plötzlich das saubere Layout. Die Schrift scheint eine Kleinigkeit zu sein — bis genau sie den Eindruck der gesamten Anwendung verdirbt.

Dieses Kapitel wird entdecken, dass die Arbeit mit Schriften nicht darum geht, „Times oder Arial auszuwählen”. Hier wird offenbart, wie Qt tatsächlich Textgrößen berechnet, warum einige Strings perfekt ins Interface passen und andere nicht, und welcher verborgene Mechanismus vorhersehbare Ergebnisse ohne manuelle Anpassungen ermöglicht. Sie erfahren das Geheimnis, das professionelle Entwickler nutzen, damit Interfaces ordentlich und stabil auf Windows, Linux und macOS aussehen.

Im Kapitel werden 3 Schlüsselklassen von Qt für die Schriftarbeit behandelt, echte Textmessungen in Pixeln gezeigt sowie praktische Techniken für Ausrichtung, Umbruch und Kürzung von Strings — einschließlich intelligentem Mittenbruch. Ergebnis: weniger Workarounds und bis zu 3-mal weniger manuelle UI-Korrekturen.

Dieses Kapitel zu überspringen bedeutet eines: Sie werden weiterhin raten, warum sich Text „seltsam” verhält, anstatt ihn präzise zu steuern.

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

Selbstüberprüfung zum Kapitel

Warum wird eine skalierbare Schrift als „ideale mathematische Beschreibung” bezeichnet und wie beeinflusst dies die Schriftausgabe?Antwort
Richtige Antwort: Sie ermöglicht die Darstellung der Schrift ohne Verzerrung in jeder Größe, und Rasterisierungsfunktionen konvertieren automatisch die mathematische Darstellung in eine Rastermatrix ohne zusätzlichen Entwickleraufwand.
Warum werden in der Methode QFont("XYZ Font, Arial, Helvetica, sans-serif") mehrere Schriften durch Kommata getrennt angegeben?Antwort
Richtige Antwort: Dies bietet ein Fallback-Schriftsystem: Wenn XYZ Font nicht verfügbar ist, wählt Qt intelligent Arial, dann Helvetica, dann jede sans-serif-Schrift, was das Verhalten vorhersehbarer macht.
Was ist der Unterschied zwischen den Methoden width() und horizontalAdvance() der Klasse QFontMetrics?Antwort
Richtige Antwort: Die Methode width() kann einen Teil des Strings und die Anzahl der zu messenden Zeichen annehmen, während horizontalAdvance() die vollständige Größe des gesamten übergebenen Strings unter Berücksichtigung aller Zeichen misst.
Warum sollte die Methode boundingRect() vor der Textanzeige verwendet werden?Antwort
Richtige Antwort: Sie gibt ein QRect-Objekt mit den Abmessungen des rechteckigen Bereichs zurück, der für die Textanzeige benötigt wird, was es ermöglicht, die Geometrie im Voraus zu bestimmen und die Textplatzierung im Interface korrekt zu planen.
Was bedeuten die Werte, die von den Methoden ascent() und descent() zurückgegeben werden, und warum sind sie wichtig?Antwort
Richtige Antwort: ascent() gibt die maximale Zeichenhöhe über der Grundlinie zurück (einschließlich diakritischer Zeichen), während descent() den Maximalwert unterhalb der Grundlinie angibt; sie sind für die genaue vertikale Textausrichtung notwendig.
Warum kann das Flag TextDontClip bei der Ausgabe von langem Text problematisch sein?Antwort
Richtige Antwort: Dieses Flag garantiert, dass Text auch beim Überschreiten der angegebenen Bereichsgrenzen nicht abgeschnitten wird, was zu Textüberlagerungen mit anderen Interface-Elementen führen kann.
Wie füllt man Text mit einem Gradienten und warum wird der Gradient über QPen und nicht QBrush übergeben?Antwort
Richtige Antwort: Es wird ein QLinearGradient mit Farbübergängen erstellt, dann an den QPen-Konstruktor übergeben, der über setPen() gesetzt wird. Der Stift wird verwendet, da Text in QPainter als Kontur gezeichnet wird, nicht als Füllung wie eine Figur.
In welchen praktischen Situationen ist die Methode elidedText() gegenüber Abschneiden oder Textumbruch vorzuziehen?Antwort
Richtige Antwort: Bei der Anzeige von Verzeichnispfaden, langen Dateinamen oder Überschriften in begrenztem Raum, wo es wichtig ist, dem Benutzer zu zeigen, dass der Text gekürzt ist, während Anfang und/oder Ende des Strings erhalten bleiben.
Warum gibt die Methode elidedText() einen neuen String zurück, anstatt den ursprünglichen zu ändern?Antwort
Richtige Antwort: Dies bewahrt den Originaltext unverändert für mögliche spätere Verwendung und entspricht den Prinzipien der Datenunveränderlichkeit; die angezeigte Darstellung ist von den gespeicherten Daten getrennt.
Was ist der Unterschied zwischen setFont() für ein Widget und QApplication::setFont()?Antwort
Richtige Antwort: QWidget::setFont() setzt die Schrift nur für ein spezifisches Widget, während die statische Methode QApplication::setFont() die Standardschrift für die gesamte Anwendung festlegt.
Warum funktioniert der Mnemonik-Mechanismus TextShowMnemonic auf verschiedenen Plattformen unterschiedlich?Antwort
Richtige Antwort: Qt verarbeitet Ampersand-Zeichen korrekt und weist Zugriffstasten zu, aber die Unterstreichungssichtbarkeit wird von der Plattform bestimmt: In Windows 10/11 ist sie standardmäßig verborgen, in Linux hängt es vom Theme ab, und in macOS werden Mnemoniken überhaupt nicht verwendet.
Was passiert, wenn das Flag TextWordWrap zusammen mit TextSingleLine verwendet wird?Antwort
Richtige Antwort: Es entsteht ein Flag-Konflikt: TextSingleLine ignoriert Zeilenumbruchzeichen, während TextWordWrap versucht, Text auf eine neue Zeile umzubrechen, was zu unvorhersehbarem Ergebnis führt — es sollte nur eines dieser Flags verwendet werden.
Wofür können die Methoden leftBearing() und rightBearing() der Klasse QFontMetrics verwendet werden?Antwort
Richtige Antwort: Sie geben den linken und rechten Buchstabenabstand in Pixeln zurück, was für genaue Zeichenpositionierung wichtig ist, besonders bei der Erstellung von benutzerdefiniertem Text-Rendering oder Animation einzelner Buchstaben.

Praktische Aufgaben

Einfaches Level

Systemschrift-Informationen
Erstellen Sie eine Anwendung, die eine Liste aller im System installierten Schriften in einem QTextEdit-Widget anzeigt. Für jede Schrift geben Sie ihren Namen in dieser Schrift selbst aus. Die Schriftgröße soll 14pt betragen.
Hinweise: Verwenden Sie die Klasse QFontDatabase und die Methode families() zum Abrufen der Schriftliste. Erstellen Sie für jede Schrift einen HTML-String mit dem Tag <font face=”…”>. Fügen Sie das Ergebnis in QTextEdit mit der Methode setHtml() ein.

Mittleres Level

Schriftmetrik-Analysator
Entwickeln Sie ein Widget, das dem Benutzer ermöglicht, eine Schrift und ihre Größe (über Comboboxen) auszuwählen, Text in ein Textfeld einzugeben und eine Visualisierung der Metriken dieses Textes zu sehen: Grundlinie, ascent, descent, Breite, Höhe. Verwenden Sie verschiedene Farben zur Anzeige unterschiedlicher Eigenschaften. Geben Sie numerische Metrikwerte aus.
Hinweise: Erstellen Sie ein benutzerdefiniertes Widget mit überschriebenem paintEvent(). Verwenden Sie QFontMetrics zum Abrufen aller notwendigen Metriken. Zeichnen Sie horizontale Linien für Grundlinie, ascent und descent in verschiedenen Farben. Verwenden Sie QPainter::drawLine() und drawText() zur Visualisierung.

Schwieriges Level

Adaptives Text-Widget mit Effekten
Erstellen Sie ein benutzerdefiniertes Widget zur Textanzeige, das sich automatisch an die Fenstergröße anpasst: Bei ausreichendem Platz zeigt es den vollständigen Text mit Gradientenfüllung, bei Größenreduzierung wendet es elided text an (mit Wahl der Bruchposition), und bei kritisch kleiner Größe wechselt es in den mehrzeiligen Modus mit Wortumbruch. Fügen Sie die Möglichkeit hinzu, Gradientenstil und Bruchposition über ein Kontextmenü auszuwählen.
Hinweise: Überschreiben Sie paintEvent() und resizeEvent(). In paintEvent() prüfen Sie die aktuelle Widget-Breite und wenden die entsprechende Anzeigestrategie an. Für Gradienten verwenden Sie QLinearGradient mit dynamischen, von der Widget-Größe abhängigen Koordinaten. Verwenden Sie fontMetrics().horizontalAdvance() zur Bestimmung von Breitenschwellenwerten. Fügen Sie contextMenuEvent() für das Einstellungsmenü hinzu.

💬 Werden Sie Teil der Diskussion!

Haben Sie Schriftmetriken und Nuancen der Textanzeige in Qt verstanden? Fragen zur Wahl zwischen verschiedenen drawText()-Methoden oder zur Arbeit mit Gradientenfüllung?

Teilen Sie Ihre Erkenntnisse in der Schriftarbeit, berichten Sie von unkonventionellen Lösungen oder helfen Sie anderen Lesern, die Feinheiten von QFontMetrics zu verstehen!

Leave a Reply

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