如何格式化QString?


77

我想格式化Qt标签的字符串,我正在Qt上用C ++编程。

在ObjC中,我将编写如下内容:

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

如何在Qt中做类似的事情?

Answers:


167

您可以像这样使用QString.arg

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

此方法优于sprintf,因为:

更改字符串的位置而不必更改替换顺序,例如

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

或者,更改参数的类型不需要更改格式字符串,例如

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

如您所见,更改很小。当然,您通常不必关心传递给QString :: arg()的类型,因为大多数类型都正确地被重载了。

但是有一个缺点:QString :: arg()不处理std :: string。您需要在std :: string上调用:QString :: fromStdString()以使其成为QString,然后再将其传递给QString :: arg()。尝试将使用QString的类与使用std :: string的类分开。或者,如果可以,请完全切换到QString。

更新:感谢Frank Osterfeld更新了示例。

更新:由于alexisdm,示例得以更新。


22
避免像这样使用.arg()。arg()链,而不要使用.arg(x,y,z)代替.arg(x).arg(y).arg(z)。它既更快又更安全-如果字符串x包含例如“%1”,则y将替换该%1而不是%2。通常不是一个人想要的。
弗兰克·奥斯特费尔德

3
尽管可以更改顺序,但是似乎无法删除编号的参数。例如,QString(“%3”)。arg(“〜”,“ Tom”,“ Jane”)的结果为“〜”。并没有最初看起来有用的...
iforce2d 2011年

也许吧,但是将那些多余的参数也留在arg()中就没有意义了。在sprintf中,如果您更改参数的类型,现在还需要在格式字符串中进行更多更改。
Dat Chu

6
第三个示例.arg("~", "Tom", 1)不起作用,您需要单独替换数字参数:.arg("~", "Tom").arg(1)或先将其转换为字符串:.arg("~", "Tom", QString::number(1))
alexisdm 2012年

QString("%1 %1 blah blah %1").arg("Tom")
cmeub 2013年

33

您可以使用该sprintf方法,但是该arg方法是首选方法,因为它支持unicode。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.