Cum să formatați un QString? (Programare, C++, Qt, Formatarea Șirurilor De Caractere)

hubert poduszczak a intrebat.

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?

3 răspunsuri
Dat Chu

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.

Comentarii

    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 .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.
  • Ce se întâmplă cu QString("%1 %1 blah blah %1").arg("Tom")? –  > Por cmeub.
trojanfoe

Puteți folosi sprintf însă metoda arg este preferată, deoarece acceptă Unicode.

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

Stephen Chu

Utilizați QString::arg() pentru același efect.