Comment changer la chaîne en QString?


Réponses:


154

Si vous std::stringentendez par chaîne, vous pouvez le faire avec cette méthode:

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

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

Si par chaîne vous entendez encodé Ascii, const char *vous pouvez utiliser cette méthode:

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

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

Si vous avez const char *encodé avec un encodage système qui peut être lu avec QTextCodec :: codecForLocale (), vous devez utiliser cette méthode:

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

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

Si vous avez const char *encodé en UTF8, vous devrez utiliser cette méthode:

QString QString :: fromUtf8 (const char * str, taille int = -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);

Il existe également une méthode pour const ushort *contenir une chaîne encodée en UTF16:

QString QString :: fromUtf16 (const ushort * unicode, taille int = -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
Vous ne voudriez pas construire le QString avec `new '.
rohanpm

@Rohan - Merci pour votre commentaire. Je supprime cela de ma réponse.
Kamil Szot

Cela ne répond pas à la question.
CCoder

1
Je n'ai jamais vu de réponse acceptée avec autant de votes négatifs. Pourquoi l'auteur ne le modifie-t-il pas dans quelque chose de mieux que la réponse la plus votée? Vous aimez ajouter plus de détails? Jusque-là, profitez d'un -1 de plus.
Tomáš Zato - Réintégrer Monica

3
Il semble que c'est corrigé maintenant, et c'est plutôt bon, alors j'ai donné à la fois ceci et l'autre +1.
csl

242

Si compilé avec la compatibilité STL, QStringa une méthode statique pour convertir a std::stringen a QString:

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

3
Cela devrait en fait être évité à mon avis. Si la version de la bibliothèque standard avec laquelle QT a été compilé est différente de celle avec laquelle vous compilez, vous allez avoir des problèmes. In crée une dépendance inutile entre QT et libstdc ++ qui n'existe nulle part ailleurs dans QT.
shoosh le

@shoosh: Pour éviter cela, ne pouvait-on pas le faire QString qstr = QString(str.c_str());? Je ne sais pas si QStringcopie ce qui y est passé.
Claudiu

@shoosh: Je comprends vos préoccupations concernant la compatibilité, mais QString et std :: string peuvent contenir des caractères nuls. fromStdStringles conservera, en construisant à partir de .c_strne pas. (Et c'est précisément comment faire cela qui m'a amené à cette question.)
Martin Bonner soutient Monica

@MartinBonner QByteArray a un cteur qui prend const char * et length. QString a un ctor qui prend QByteArray
shoosh

13

Voie alternative:

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

Cela a l'avantage de ne pas utiliser, .c_str()ce qui pourrait entraîner la std::stringcopie du lui-même au cas où il n'y aurait aucun endroit pour ajouter le '\0'à la fin.


2
Merci pour l'indication sur la copie cachée potentielle avec .c_str ().
Trass3r

Avec c ++ 11, ce n'est plus un problème (copie cachée avec .c_str())
Steve Lorimer

1
Avant C ++ 11, la copie cachée potentielle était une possibilité purement théorique - aucune implémentation ne le faisait réellement.
Martin Bonner soutient Monica

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

Attention: cela ne fonctionnera pas si le std::stringcontient \0s.


3

Je suis tombé sur cette question parce que j'avais un problème en suivant les réponses, donc je poste ma solution ici.

Les exemples ci-dessus montrent tous des échantillons avec des chaînes contenant uniquement des valeurs ASCII, auquel cas tout fonctionne correctement. Cependant, lorsque vous traitez avec des chaînes dans Windows, qui peuvent également contenir d'autres caractères, comme des trémas allemands, ces solutions ne fonctionnent pas.

Le seul code qui donne des résultats corrects dans de tels cas est

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

Si vous n'avez pas à gérer de telles chaînes, les réponses ci-dessus fonctionneront correctement.


Cela ne dépend pas de std :: string mais du codage de votre fichier source avec le littéral de chaîne. Si votre fichier source est UTF8, cela fonctionnera mais interrompra votre appel àfromLocal8Bit()
namezero

0

De plus, pour convertir ce que vous voulez, vous pouvez utiliser la classe QVariant.

par exemple:

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

production

"hello !"
"10"
"5.42"
5

0

Voulez-vous dire une chaîne C, comme dans une char*chaîne, ou un std::stringobjet C ++ ?

Dans tous les cas, vous utilisez le même constructeur, comme indiqué dans la référence QT:

Pour une chaîne C régulière, utilisez simplement le constructeur principal:

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

Pour a std::string, vous obtenez le char*dans le tampon et le transmettez au QStringconstructeur:

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

1
C'est vrai, bien que l'OP n'ait pas mentionné les NULL intégrés. Si cela est nécessaire, vous pouvez d'abord utiliser QByteArray::QByteArray (const char* data, int size)pour encapsuler le tampon, puis le transmettre au QStringconstructeur.
gavinb
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.