====== 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.