Не во всех случаях проканает.
Я тоже с этим боролся, но потом стало ясно, что это и не нужно. Без этого можно легко обойтись.
Например, там где у тебя должен быть твой %n выводить его в последнюю очередь.
Либо еще вариант.
QString( "it's my percent string %%1" ).arg( <n> );
А чего проще не париться и использовать конкатенацию строк.
Еще почитай внимательнее про QString::arg( const QString &a1, const QString &a2, const QString &a3 ); и чем отличается от последовательного вызова arg().arg().arg()
Пример:
QString s("%1 %2 %3");
qDebug() << s.arg( "%1", "%2", "%3" );
qDebug() << s.arg( "%1" ).arg( "%2" ).arg( "%3" );
Вывод:
"%1 %2 %3"
"%3 %3 %3"
Почему так читай в ассистенте. Я уже и так много понаписал