如何格式化一个QString?

94

我想为Qt标签格式化一个字符串,我在Qt上用C++进行编程。

在ObjC中,我会写类似于:

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

如何在Qt中实现类似的功能?

3个回答

192

您可以像这样使用 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。您需要在将其传递给 QString::arg() 之前调用 QString::fromStdString() 将其转换为 QString。尽量将使用 QString 的类与使用 std::string 的类分开。或者,如果可以的话,完全切换到 QString。

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

更新:感谢 alexisdm 更新了示例。


25
避免使用.arg().arg()这样的链式结构,而是使用.arg(x, y, z)。这样更快速、更安全。如果字符串x包含例如"%1",y将替换掉%1而不是%2。通常这不是我们想要的结果。 - Frank Osterfeld
3
虽然你可以更改排序,但似乎无法去除编号参数。例如,QString("%3").arg("", "Tom", "Jane") 的结果是“”。并不像一开始看起来那么有用... - iforce2d
也许可以,但是把那些额外的参数留在arg()中就没有意义了。在sprintf中,如果你改变参数的类型,现在你还需要在格式字符串中进行更多的更改。 - Dat Chu
7
第三个例子.arg("~", "Tom", 1)无效,你需要分别替换数字参数:.arg("~", "Tom").arg(1),或者先将其转换为字符串:.arg("~", "Tom", QString::number(1)) - alexisdm
QString("%1 %1 blah blah %1").arg("Tom")这个怎么样? - cmeub
显示剩余2条评论

39
您可以使用`sprintf`方法,但是`arg`方法更好,因为它支持unicode。
QString str;
str.sprintf("%s %d", "string", 213);

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接