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

Posted

技术标签:

【中文标题】QString::arg()的参数中的“%1”如何处理?【英文标题】:How to deal with "%1" in the argument of QString::arg()? 【发布时间】:2011-07-12 02:22:38 【问题描述】:

每个人都喜欢

QString("Put something here %1 and here %2")
    .arg(replacement1)
    .arg(replacement2);

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

有什么标准技巧可以克服这个问题吗?

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

#include <QCoreApplication>
#include <QDebug>

int main()

    qDebug() << QString("%1-%2").arg("%1").arg("foo");
    return 0;

这将输出

"foo-%2"

而不是

"%1-foo"

正如预期的那样(不是)。

    qDebug() << QString("%1-%2").arg("%2").arg("foo");

给予

"foo-foo"

    qDebug() << QString("%1-%2").arg("%3").arg("foo");

给予

"%3-foo"

【问题讨论】:

我知道,我可以使用 operator + () 进行字符串连接,但在某些地方,例如使用tr() 进行翻译,希望保留对模板中的参数重新排序的能力。 哇!我从未遇到过这种情况,但如果翻译是字符串“%1”(例如,与 1% 相对),那么它根本无法正常工作。这真的没有意义。看起来他们一遍又一遍地将参数重新应用于结果。 不是有可能通过写“%%1”来伪转义“%1”吗?在 arg 调用中使用百分比标记的功能仍然很好。想象一下,您有一个标准错误字符串,使用%1 替换“where”和%2 替换“what” - 现在在某些情况下您只需将“where”替换为字符串,在其他情况下您想要一个数字.如果是字符串,您可能希望在其周围加上撇号,如果是数字,则前面的主题标签会很好地提高可读性。现在您可以使用第一个 arg-call 将 %1 替换为 f.e. "#%3" 和第三次 arg 调用以插入号码。 【参考方案1】:

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

QString str;
str = "%1 %2";
str.arg("%1f", "Hello"); // returns "%1f Hello"

【讨论】:

好的,谢谢!以及如何处理需要QString::arg() 的不同重载的情况,例如数字呢?在 multi-QString-arg() 中使用 QString::number() 不是一回事,因为它不能让您指定字段宽度。 好的,我可以使用QString::leftJustified()QString::rightJustified(),但这会变得冗长。我认为拥有arg() 的自动转义版本会很棒。 @Johnny, QString("%1-%2").arg("%1").arg(23, 8, 10, QChar('0')); 将使用QString("00000023-%2") 而不是QString("%1-00000023") @Tilman,您对此有何看法: QString("%1-%2").arg("%1", QString("%1").arg(23, 8, 10、QChar('0'))); ? @Johnny,是的,并不完全糟糕 ;-) 仍然可悲,它在最初的优雅中不起作用......一种方法是在替换中逃避所有 % 并在arg() 淋浴已停止,使用了一些中间字符串模板类。感谢您的想法!【参考方案2】:

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

QString("1%1 2%2 3%3 4%4").arg(int1).arg(string2).arg(string3).arg(int4);

变成

QString("1%1 2%3 3%4 4%2").arg(int1).arg(int4).arg(string2, string3);

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

【讨论】:

【参考方案3】:

你应该尝试使用

QString("%1-%2").arg("%2","foo");

【讨论】:

以上是关于QString::arg()的参数中的“%1”如何处理?的主要内容,如果未能解决你的问题,请参考以下文章

QString::?arg的用法

QString arg能不能像Python format一样使用

QT 的数据库问题,QString::arg()

Qt多国语言国际化

qt 连接mysql数据库问题

如何测试 DataRows 中的所有参数组合