如何在QString :: arg()的参数中处理"%1"?

Til*_*gel 24 qstring qt placeholder string-formatting

所有人都喜欢

QString("Put something here %1 and here %2")
    .arg(replacement1)
    .arg(replacement2);
Run Code Online (Sandbox Code Playgroud)

但是只要你有最微小的机会replacement1实际包含%1甚至是%2任何地方,事情就会变得痒痒.然后,第二个QString::arg()将仅替换重新引入%1或两个%2事件.无论如何,你不会得到"%1"你可能想要的文字.

是否有任何标准技巧可以克服这个问题?

如果你需要一个例子来玩,请拿这个

#include <QCoreApplication>
#include <QDebug>

int main()
{
    qDebug() << QString("%1-%2").arg("%1").arg("foo");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这将输出

"foo-%2"
Run Code Online (Sandbox Code Playgroud)

代替

"%1-foo"
Run Code Online (Sandbox Code Playgroud)

可能是预期的(不是).

    qDebug() << QString("%1-%2").arg("%2").arg("foo");
Run Code Online (Sandbox Code Playgroud)

"foo-foo"
Run Code Online (Sandbox Code Playgroud)

    qDebug() << QString("%1-%2").arg("%3").arg("foo");
Run Code Online (Sandbox Code Playgroud)

"%3-foo"
Run Code Online (Sandbox Code Playgroud)

Joh*_*nny 22

请参阅有关QString :: arg()的Qt文档:

QString str;
str = "%1 %2";
str.arg("%1f", "Hello"); // returns "%1f Hello"
Run Code Online (Sandbox Code Playgroud)


And*_*urg 6

请注意,arg()多个参数的重载仅采用 QString。如果并非所有参数都是 QStrings,您可以更改格式字符串中占位符的顺序:

QString("1%1 2%2 3%3 4%4").arg(int1).arg(string2).arg(string3).arg(int4);
Run Code Online (Sandbox Code Playgroud)

变成

QString("1%1 2%3 3%4 4%2").arg(int1).arg(int4).arg(string2, string3);
Run Code Online (Sandbox Code Playgroud)

这样,所有不是字符串的东西都会先被替换,然后所有的字符串同时被替换。