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”如何处理?的主要内容,如果未能解决你的问题,请参考以下文章