Як відформатувати QString?


79

Я хотів би відформатувати рядок для мітки Qt, я програмую на C ++ на Qt.

У ObjC я б написав щось на зразок:

NSString *format=[NSString stringWithFormat: ... ];

Як зробити щось подібне в Qt?

Відповіді:


170

Ви можете використовувати QString.arg таким чином

QString my_formatted_string = QString("%1/%2-%3.txt").arg("~", "Tom", "Jane");
// You get "~/Tom-Jane.txt"

Цей метод є кращим перед sprintf, оскільки:

Зміна положення рядка без необхідності змінювати порядок заміщення, наприклад

// To get "~/Jane-Tom.txt"
QString my_formatted_string = QString("%1/%3-%2.txt").arg("~", "Tom", "Jane");

Або зміна типу аргументів не вимагає зміни рядка формату, наприклад

// To get "~/Tom-1.txt"
QString my_formatted_string = QString("%1/%2-%3.txt").arg("~", "Tom", QString::number(1));

Як бачите, зміни мінімальні. Звичайно, вам зазвичай не потрібно дбати про тип, який передається в QString :: arg (), оскільки більшість типів правильно перевантажені.

Однак один недолік: QString :: arg () не обробляє std :: string. Вам потрібно буде викликати: QString :: fromStdString () на вашому std :: string, щоб перетворити його на QString перед передачею його в QString :: arg (). Спробуйте відокремити класи, які використовують QString, від класів, що використовують std :: string. Або якщо ви можете, перейдіть на QString взагалі.

ОНОВЛЕННЯ: Приклади оновлюються завдяки Франку Остерфельду.

ОНОВЛЕННЯ: Приклади оновлюються завдяки alexisdm.


23
Уникайте подібних ланцюжків .arg (). Arg (), замість .arg (x) .arg (y) .arg (z) використовуйте .arg (x, y, z). Це швидше і безпечніше. Якщо рядок x містить, наприклад, "% 1", y замінить% 1 замість% 2. Зазвичай не те, що хтось задумав.
Frank Osterfeld

3
Хоча ви можете змінити порядок, видалити пронумеровані аргументи не представляється можливим. Наприклад, QString ("% 3"). Arg ("~", "Tom", "Jane") призводить до "~". Не настільки корисно, як здавалося спочатку ...
iforce2d

Можливо, але тоді немає сенсу також залишати ці додаткові аргументи в arg (). У sprintf, якщо ви зміните тип аргументів, тепер вам також потрібно внести більше змін у рядок формату.
Дат Чу

7
Третій приклад .arg("~", "Tom", 1)не працює, вам потрібно замінити числовий аргумент окремо: .arg("~", "Tom").arg(1)або перетворити його в рядок перший: .arg("~", "Tom", QString::number(1)).
alexisdm

Що про QString("%1 %1 blah blah %1").arg("Tom")?
cmeub

33

Ви можете використовувати sprintfметод, однак argметод є кращим, оскільки він підтримує Unicode.

QString str;
str.sprintf("%s %d", "string", 213);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.