Come cambiare la stringa in QString?


Risposte:


154

Se per stringa intendi std::stringche puoi farlo con questo metodo:

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

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

Se per stringa intendi Ascii codificato const char *, puoi utilizzare questo metodo:

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

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

Se hai const char *codificato con la codifica di sistema che può essere letta con QTextCodec :: codecForLocale (), devi 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 hai const char *codificato UTF8, dovrai usare 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 un metodo per const ushort *contenere una stringa codificata UTF16:

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 vorrai costruire il QString con `nuovo '.
rohanpm,

@Rohan - Grazie per il tuo commento. Lo sto rimuovendo dalla mia risposta.
Kamil Szot,

Non risponde alla domanda.
CCoder

1
Non ho mai visto una risposta accettata con così tanti voti negativi. Perché l'autore non lo modifica in qualcosa di meglio della risposta più votata? Ti piace aggiungere più dettagli? Fino ad allora, goditi un altro -1.
Tomáš Zato - Ripristina Monica il

3
Sembra che sia stato risolto ora, ed è abbastanza buono, quindi ho dato sia questo che l'altro +1.
CSL

242

Se compilato con compatibilità STL, QStringha un metodo statico per convertire a std::stringin QString:

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

3
Questo dovrebbe effettivamente essere evitato a mio avviso. Se la versione della libreria standard QT con cui è stata compilata è in qualche modo diversa da quella con cui 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,

@shoosh: per evitare che non si possa semplicemente fare QString qstr = QString(str.c_str());? Non sono sicuro se QStringcopia ciò che vi è passato.
Claudiu,

@shoosh: capisco le tue preoccupazioni sulla compatibilità, ma sia QString che std :: string possono contenere caratteri null. fromStdStringconserverà questi, costruendo dal .c_strnon. (Ed è stato proprio come fare questo che mi ha portato a questa domanda.)
Martin Bonner supporta Monica il

@MartinBonner QByteArray ha un ctor che accetta const char * e length. QString ha un ctor che prende QByteArray
shoosh il

13

Modo alternativo:

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

Ciò ha il vantaggio di non utilizzare, il .c_str()che potrebbe causare la std::stringcopia da sola nel caso in cui non ci sia spazio per aggiungere il '\0'alla fine.


2
Grazie per il suggerimento sulla potenziale copia nascosta con .c_str ().
Trass3r,

Con c ++ 11, questo non è più un problema (copia nascosta con .c_str())
Steve Lorimer,

1
Prima di C ++ 11, la potenziale copia nascosta era una possibilità puramente teorica - nessuna implementazione lo ha effettivamente fatto.
Martin Bonner supporta Monica il

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

Attenzione: questo non funzionerà se std::stringcontiene \0s.


3

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

Gli esempi sopra mostrano tutti i campioni con stringhe contenenti solo valori ASCII, nel qual caso tutto funziona bene. Tuttavia, quando si ha a che fare con stringhe in Windows che possono contenere anche altri caratteri, come le umlaut tedesche, queste soluzioni non funzionano

L'unico codice che fornisce risultati corretti in questi casi è

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

Se non hai a che fare con tali stringhe, le risposte sopra funzioneranno bene.


Questo non dipende da std :: string ma dalla codifica del file sorgente con la stringa letterale. Se il tuo file sorgente è UTF8, funzionerà ma interrompi la chiamata afromLocal8Bit()
namezero

0

Inoltre, per convertire quello che vuoi, puoi usare la classe QVariant.

per 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();

produzione

"hello !"
"10"
"5.42"
5

0

Intendi una stringa C, come in una char*stringa, o un std::stringoggetto C ++ ?

Ad ogni modo, usi lo stesso costruttore, come documentato nel riferimento QT:

Per una normale stringa C, basta usare il costruttore principale:

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

Per a std::string, si ottiene il char*al buffer e lo si passa al QStringcostruttore:

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

1
Abbastanza vero, anche se l'OP non ha menzionato i NULL incorporati. Se necessario, è possibile utilizzare QByteArray::QByteArray (const char* data, int size)prima il wrapper del buffer, quindi passarlo al QStringcostruttore.
Gavav
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.