2009-11-28 10 views

risposta

70

Se da stringa si intende std::string si può fare con questo metodo:

QString QString::fromStdString(const std::string & str)

std::string str = "Hello world"; 
QString qstr = QString::fromStdString(str); 

Se da stringa si intende Ascii codificato const char * quindi è possibile utilizzare questo metodo:

QString QString::fromAscii(const char * str, int size = -1)

const char* str = "Hello world"; 
QString qstr = QString::fromAscii(str); 

Se avete const char * codificati con la codifica del sistema che possono essere letti con QTextCodec::codecForLocale() allora si dovrebbe utilizzare questo metodo:

QString QString::fromLocal8Bit(const char * str, int size = -1)

const char* str = "zażółć gęślą jaźń";  // latin2 source file and system encoding 
QString qstr = QString::fromLocal8Bit(str); 

Se avete const char * che è UTF-8 codificato quindi dovrai utilizzare questo metodo:

QString QString::fromUtf8(const char * str, int size = -1)

const char* str = read_raw("hello.txt"); // assuming hello.txt is UTF8 encoded, and read_raw() reads bytes from file into memory and returns pointer to the first byte as const char* 
QString qstr = QString::fromUtf8(str); 

C'è anche metodo per const ushort * contenente UTF16 stringa codificata:

QString QString::fromUtf16(const ushort * unicode, int size = -1)

const ushort* str = read_raw("hello.txt"); // assuming hello.txt is UTF16 encoded, and read_raw() reads bytes from file into memory and returns pointer to the first byte as const ushort* 
QString qstr = QString::fromUtf16(str); 
+1

Non si vuole per costruire il QString con 'nuova'. – rohanpm

+0

@Rohan - Grazie per il tuo commento. Sto rimuovendo questo dalla mia risposta. –

+0

Non risponde alla domanda. – CCoder

10
std::string s = "Sambuca"; 
QString q = s.c_str(); 

Attenzione: Questo non funzionerà i f il std::string contiene \0 s.

+10

Non funziona con '\ 0' incorporato. –

+0

Non è sicuro anche per Unicode. –

0

Si intende una stringa C, come in una stringa char* o un oggetto C++ std::string?

In entrambi i casi, si utilizza lo stesso costruttore, come documentato nel riferimento QT:

Per una stringa regolare C, basta utilizzare il costruttore principale:

char name[] = "Stack Overflow"; 
QString qname(name); 

Per un std::string, si ottiene il char* nel buffer e lo si passa allo QString costruttore:

std::string name2("Stack Overflow"); 
QString qname2(name2.c_str()); 
+2

L'esempio 'std :: string' non funziona con' \ 0' incorporato. –

+1

È vero, anche se l'OP non ha menzionato NULL incorporati. Se è necessario, è possibile utilizzare 'QByteArray :: QByteArray (const char * data, int size)' per impacchettare prima il buffer, quindi passarlo al costruttore 'QString'. – gavinb

229

Se compilato con compatibilità STL, QString ha un static method per convertire un std::string ad un QString:

std::string str = "abc"; 
QString qstr = QString::fromStdString(str); 
+33

Questa dovrebbe essere la risposta accettata. –

+3

Questo dovrebbe essere evitato a mio avviso. Se la versione della libreria standard QT è stata compilata in qualche modo diversa da quella che stai compilando, avrai dei problemi. In crea una dipendenza non necessaria tra QT e libstdC++ che non esiste da nessun'altra parte in QT. – shoosh

+0

@shoosh: Per evitare che non si possa semplicemente fare 'QString qstr = QString (str.c_str());'? Non sono sicuro che 'QString' copi ciò che è passato in esso. – Claudiu

13

modo alternativo:

std::string s = "This is an STL string"; 
QString qs = QString::fromAscii(s.data(), s.size()); 

Questo ha il vantaggio di non usando .c_str() che potrebbe causare il std::string a c opy stesso nel caso in cui non ci sia posto per aggiungere il '\0' alla fine.

+2

Grazie per l'indicazione sulla potenziale copia nascosta con .c_str(). – Trass3r

+0

Con C++ 11, questo non è più un problema (copia nascosta con '.c_str()') –

+1

Prima di C++ 11, la potenziale copia nascosta era una possibilità puramente teorica - nessuna implementazione lo ha effettivamente fatto. –

3

Mi sono imbattuto in questa domanda perché ho avuto un problema nel seguire le risposte, quindi inserisco qui la mia soluzione.

Gli esempi precedenti mostrano tutti gli esempi con stringhe contenenti solo valori ASCII, nel qual caso tutto funziona correttamente. Tuttavia, quando si tratta di stringhe in Windows pagherei possono contenere anche altri personaggi, come la dieresi tedesco, allora queste soluzioni non funzionano

L'unico codice che dà risultati corretti in questi casi è

std::string s = "Übernahme"; 
QString q = QString::fromLocal8Bit(s.c_str()); 

Se non devono occuparsi di tali stringhe, quindi le risposte sopra funzioneranno bene.

0

Inoltre, per convertire tutto ciò che si desidera, è possibile utilizzare la classe QVariant.

ad esempio:

std::string str("hello !"); 
qDebug() << QVariant(str.c_str()).toString(); 
int test = 10; 
double titi = 5.42; 
qDebug() << QVariant(test).toString(); 
qDebug() << QVariant(titi).toString(); 
qDebug() << QVariant(titi).toInt(); 

uscita

"hello !" 
"10" 
"5.42" 
5