====== 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 [[frameworks:qt:general:debug|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:start|C]] und [[cpp:start|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 [[frameworks:qt:general:implicitsharing|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 [[c:lib:string:strcmp|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 [[c:lib:stdio:formatstring|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 [[frameworks:qt:general:i18n|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.