如何格式化QString?

hub*_*zak 71 c++ qt string-formatting

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

在ObjC中,我会写一些类似于:

NSString *format=[NSString stringWithFormat: ... ];
Run Code Online (Sandbox Code Playgroud)

如何在Qt中做这样的事情?

Dat*_*Chu 151

您可以像这样使用QString.arg

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

这种方法比sprintf更受欢迎,因为:

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

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

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

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

如您所见,变化很小.当然,您通常不需要关心传递给QString :: arg()的类型,因为大多数类型都是正确重载的.

但有一个缺点:QString :: arg()不处理std :: string.您需要在std :: string上调用:QString :: fromStdString(),以便在将其传递给QString :: arg()之前将其转换为QString.尝试将使用QString的类与使用std :: string的类分开.或者,如果可以的话,完全切换到QString.

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

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

  • 避免像这样的.arg().arg()链,而不是.arg(x).arg(y).arg(z)使用.arg(x,y,z).它更快更安全 - 如果字符串x包含例如"%1",则y将替换%1而不是%2.通常不是人们想要的. (20认同)
  • 第三个例子`.arg("〜","Tom",1)`不起作用,你需要分别替换数字参数:`.arg("〜","Tom").arg(1)`或首先将它转换为字符串:`.arg("〜","Tom",QString :: number(1))`. (6认同)
  • 虽然您可以更改排序,但似乎无法删除编号的参数.例如,QString("%3").arg("〜","Tom","Jane")导致"〜".不像最初看起来那么有用...... (3认同)

tro*_*foe 29

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

QString str;
str.sprintf("%s %d", "string", 213);
Run Code Online (Sandbox Code Playgroud)


Ste*_*Chu 5

使用QString::arg()相同的效果。