Strings

Bevor wir nun mit der Erstellung von grafischen Oberflächen beginnen, kommen wir zu einem sehr allgemeinen, aber auch wichtigen Thema: Die Verwaltung von Texten in Qt.

Qt bietet eine eigene Klasse mit dem Namen QString um Zeichenketten abzuspeichern und ist somit eine verbesserte Variante der Klasse std::string aus der Standardbibliothek. Der größte Vorteil von QString ist die bessere Unterstützung von Unicode, die für die Erstellung mehrsprachiger Anwendungen unerlässlich ist. Alle Qt-Klassen (auch alle grafischen Komponenten) verwenden QString zum Speichern von Text. Änderung der Zeichenkodierung, sowie die Verwendung mit Qt-Streams (zum Schreiben in eine Datei, Senden übers Netzwerk, etc.) sind ebenfalls möglich.
Die Verwendung von QString ist größtenteils selbsterklärend und wird in den folgenden Abschnitten kurz demonstriert.

Initialisierung

Die Verwendung des Default-Konstruktors erzeugt einen leeren String. Praktischerweise kann als Parameter auch der gewünschte Inhalt angegeben werden. Dabei stehen mehrere Typen zur Auswahl, eine gängige Variante ist ein String-Literal:

QString str( "proggen.org" );

Ausgabe

Die direkte Ausgabe von QString-Objekten über std::cout in der Konsole ist nicht möglich, dazu muss mit der Methode toStdString() eine Umwandlung in einen std::string vorgenommen werden. Eine Alternative bieten die Qt-spezifischen Debug-Ausgaben.

QString str( "proggen.org" );
// Konvertierung nach std::string
std::cout << str.toStdString() << std::endl;
// Qt-Methode
qDebug() << str;

Ausgabe:

proggen.org
"proggen.org"

Bei der letzteren Methode wird der String unter Anführungszeichen gesetzt und danach ein Zeilenumbruch ausgegeben.

Eingabe

Da Qt auf die Erstellung von grafischen Oberflächen spezialisiert ist, gibt es keine Möglichkeit QString-Objekte von der Konsole einzulesen (die in Standard C und C++ enthaltenen Funktionen mit nachträglicher Konvertierung natürlich ausgenommen).

Operatoren

Überladene Operatoren vereinfachen die Verwendung und Lesbarkeit von QString noch zusätzlich.

Zuweisung

Die Zuweisung eines Strings ist mit dem normalen Zuweisungsoperator möglich:

QString str;
str = "proggen.org";

Die Zuweisung von Strings ist sehr effizient, da intern Implicit Sharing angewendet wird.

Verkettung

Strings können über den +-Operator bzw. den +=-Operator und die Methode append() verkettet werden.

QString str1( "proggen" ),
        str2( "." ),
        str3( "org" ),
        result;
result = str1.append( str2 + str3 );
qDebug() << result;

Ausgabe:

"proggen.org" 

Da append() eine Referenz auf das veränderte Objekt zurückliefert, ist auch folgendes möglich und bringt das gleiche Ergebnis:

result = str1.append( str2.append( str3 ) );

Vergleich

Der ==-Operator führt einen tatsächlichen Vergleich des Strings durch (wie in C++, anders als in C und Java, wo nur Adressen bzw. Referenzen verglichen werden).

QString str1( "proggen.org" ),
        str2( "proggen.org" );
if( str1 == str2 )
  qDebug() << "Strings sind gleich";
else
  qDebug() << "Strings sind NICHT gleich";

Ausgabe:

"Strings sind gleich"

Es existiert auch die Methode compare(), dessen Rückgabewerte jenen von strcmp() entsprechen.

Konvertierung von Zahlen

Zahlen können über die statische Methode QString::number() in ein QString-Objekt umgewandelt werden:

QString s = QString::number( 1234 );

Für die umgekehrte Konvertierung gibt es für mehrere Typen QString::to*()-Methoden, wie z.B. QString::toInt():

QString s = "1234";
int n = s.toInt();

Formatierung

Mit der Methode arg() können spezielle Argumente dynamisch in den String eingefügt werden. Dabei werden %1, %2, usw. als Platzhalter verwendet. Der Vorteil gegenüber den aus C bekannten FormatStrings ist, dass keine Datentypen angegeben werden müssen. Weiters kann sich aufgrund der eindeutigen Nummerierung die Reihenfolge innerhalb des Strings beliebig ändern, was eine wichtige Funktionalität für die Internationalisierung von Anwendungen ist.

// Platzhalterstring zuweisen
str = "%2.%1";
// String mit Platzhaltern ausgeben
qDebug() << "String mit Platzhaltern: " + str;
// Strings anstelle von Platzhaltern
qDebug() << "Platzhalter ersetzen: " + str.arg( "org", "proggen" );

Ausgabe:

"String mit Platzhaltern: %2.%1" 
"Platzhalter ersetzen: proggen.org"

Abschließendes

Dieses Kapitel soll nur einen kurzen Überblick über die Verwendungsmöglichkeiten von QString bieten. Als Qt-Programmierer sollte man sich angewöhnen immer diese Klasse anstelle von std::string zu verwenden, die Verwendung ist intuitiv und leicht zu erlernen.