Как бороться с "% 1" в аргументе QString:: arg()?

Все любят

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"

Ответы

Ответ 1

См. документы Qt о QString:: arg():

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

Ответ 2

Вам следует попробовать использовать

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

Ответ 3

Обратите внимание, что перегрузка 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);

Таким образом, все, что не является строкой, сначала заменяется, а затем все строки заменяются в одно и то же время.