Wie formatiere ich einen QString?

76

Ich möchte einen String für das Qt-Label formatieren, ich programmiere in C ++ auf Qt.

In ObjC würde ich so etwas schreiben wie:

NSString *format=[NSString stringWithFormat: ... ];

Wie macht man so etwas in Qt?

hubert poduszczak
quelle

Antworten:

166

Sie können QString.arg wie folgt verwenden

QString my_formatted_string = QString("%1/%2-%3.txt").arg("~", "Tom", "Jane");
// You get "~/Tom-Jane.txt"

Diese Methode wird Sprintf vorgezogen, weil:

Ändern der Position des Strings, ohne die Reihenfolge der Substitution ändern zu müssen, z

// To get "~/Jane-Tom.txt"
QString my_formatted_string = QString("%1/%3-%2.txt").arg("~", "Tom", "Jane");

Zum Ändern des Argumenttyps muss die Formatzeichenfolge nicht geändert werden, z

// To get "~/Tom-1.txt"
QString my_formatted_string = QString("%1/%2-%3.txt").arg("~", "Tom", QString::number(1));

Wie Sie sehen können, ist die Änderung minimal. Natürlich müssen Sie sich im Allgemeinen nicht um den Typ kümmern, der an QString :: arg () übergeben wird, da die meisten Typen korrekt überladen sind.

Ein Nachteil: QString :: arg () behandelt std :: string nicht. Sie müssen Folgendes aufrufen: QString :: fromStdString () in Ihrem std :: string, um daraus einen QString zu machen, bevor Sie ihn an QString :: arg () übergeben. Versuchen Sie, die Klassen, die QString verwenden, von den Klassen zu trennen, die std :: string verwenden. Oder wenn Sie können, wechseln Sie ganz zu QString.

UPDATE: Beispiele werden dank Frank Osterfeld aktualisiert.

UPDATE: Beispiele werden dank alexisdm aktualisiert.

Dat Chu
quelle
21
Vermeiden Sie .arg (). Arg () -Ketten wie diese, anstatt .arg (x) .arg (y) .arg (z) verwenden Sie .arg (x, y, z). Es ist sowohl schneller als auch sicherer - Wenn die Zeichenfolge x z. B. "% 1" enthält, ersetzt y diese% 1 anstelle von% 2. Normalerweise nicht das, was man beabsichtigt hat.
Frank Osterfeld
3
Obwohl Sie die Reihenfolge ändern können, scheint es nicht möglich zu sein, die nummerierten Argumente zu entfernen. Zum Beispiel führt QString ("% 3"). Arg ("~", "Tom", "Jane") zu "~". Nicht ganz so nützlich, wie es zunächst schien ...
iforce2d
Vielleicht, aber dann macht es keinen Sinn, diese zusätzlichen Argumente auch in arg () zu belassen. Wenn Sie in sprintf den Typ der Argumente ändern, müssen Sie jetzt auch weitere Änderungen an Ihrer Formatzeichenfolge vornehmen.
Dat Chu
6
Das dritte Beispiel .arg("~", "Tom", 1)funktioniert nicht. Sie müssen das numerische Argument separat ersetzen: .arg("~", "Tom").arg(1)oder es zuerst in eine Zeichenfolge konvertieren : .arg("~", "Tom", QString::number(1)).
Alexisdm
Was ist mit QString("%1 %1 blah blah %1").arg("Tom")?
Cmeub
32

Sie können die sprintfMethode verwenden, die argMethode wird jedoch bevorzugt, da sie Unicode unterstützt.

QString str;
str.sprintf("%s %d", "string", 213);
Trojaner
quelle