Aș dori să formatez un șir de caractere pentru eticheta Qt, programez în C++ pe Qt.
În ObjC aș scrie ceva de genul:
NSString *format=[NSString stringWithFormat: ... ];
Cum să fac așa ceva în Qt?
Poți folosi QString.arg în felul următor
QString my_formatted_string = QString("%1/%2-%3.txt").arg("~", "Tom", "Jane");
// You get "~/Tom-Jane.txt"
Această metodă este preferată față de sprintf deoarece:
Schimbarea poziției șirului de caractere fără a fi nevoie să schimbați ordinea de substituție, de ex.
// To get "~/Jane-Tom.txt"
QString my_formatted_string = QString("%1/%3-%2.txt").arg("~", "Tom", "Jane");
Sau, schimbarea tipului de argumente nu necesită schimbarea șirului de format, de ex.
// To get "~/Tom-1.txt"
QString my_formatted_string = QString("%1/%2-%3.txt").arg("~", "Tom", QString::number(1));
După cum puteți vedea, schimbarea este minimă. Desigur, în general, nu trebuie să vă pese de tipul care este trecut în QString::arg(), deoarece majoritatea tipurilor sunt supraîncărcate corect.
Totuși, există un dezavantaj: QString::arg() nu gestionează std::string. Va trebui să apelați: QString::fromStdString() pe std::string pentru a-l transforma într-un QString înainte de a-l trece la QString::arg(). Încercați să separați clasele care utilizează QString de clasele care utilizează std::string. Sau, dacă puteți, treceți la QString cu totul.
UPDATE: Exemplele sunt actualizate datorită lui Frank Osterfeld.
UPDATE: Exemplele sunt actualizate datorită lui alexisdm.
Puteți folosi sprintf
însă metoda arg
este preferată, deoarece acceptă Unicode.
QString str;
str.sprintf("%s %d", "string", 213);
Utilizați QString::arg()
pentru același efect.
23- Evitați lanțurile .arg().arg().arg() astfel, în loc de .arg( x ).arg( y ).arg( z ) folosiți .arg( x, y, z ). Este atât mai rapid, cât și mai sigur – Dacă șirul x conține, de exemplu, „%1”, y va înlocui acel %1 în loc de %2. De obicei, nu ceea ce se intenționa. – > Por Frank Osterfeld.
- Deși se poate schimba ordinea, nu pare să fie posibilă eliminarea argumentelor numerotate. De exemplu, QString(„%3”).arg(„~”, „Tom”, „Jane”) are ca rezultat „~”. Nu este atât de util precum părea la început… – > Por iforce2d.
- Poate, dar atunci nu are sens să lăsăm și acele argumente suplimentare în arg(). În sprintf, dacă schimbați tipul argumentelor, acum trebuie să faceți și mai multe modificări în șirul de format. – > Por Dat Chu.
- Al treilea exemplu
- Ce se întâmplă cu
.arg("~", "Tom", 1)
nu funcționează, trebuie să înlocuiți separat argumentul numeric:.arg("~", "Tom").arg(1)
sau să îl convertiți mai întâi într-un șir de caractere:.arg("~", "Tom", QString::number(1))
. – > Por alexisdm.QString("%1 %1 blah blah %1").arg("Tom")
? – > Por cmeub.