Strings

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

Qt bietet eine eigene Klasse mit dem Namen QString um Zeichenketten abzuspeichern. Viele werden sich wundern wozu das gut sein soll, da std::string doch bereits eine komfortable Abstraktion darstellt. Der größte Vorteil von QString ist die Unterstützung von Unicode, die für die Erstellung mehrsprachiger Anwendungen unerlässlich ist. Alle Qt-Klassen (auch alle Widgets) 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 erklärt.

Anlegen

Die Verwendung des Default-Konstruktors erzeugt logischerweise einen leeren String. Als Parameter kann der Inhalt angegeben werden. Dabei stehen mehrere Typen zur Auswahl, die am häufigsten verwendete ist jedoch ein konstanter char-Array:

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 Strings von der Konsole einzulesen (die in Standard C und C++ enthaltenen Funktionen 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.

FormatStrings

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.