Comment changer la chaîne en QString?

Quelle est la façon la plus simple de le faire?

122
demandé sur Angie Quijano 2009-11-29 02:56:58

7 réponses

Si par chaîne vous voulez dire std::string 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 voulez dire ASCII codé const char * alors vous pouvez utiliser cette méthode:

QString QString:: fromAscii(const char * str, Int size = -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 () alors vous devriez utiliser ceci méthode:

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

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

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

Il existe également une méthode pour const ushort * contenant une chaîne codée UTF16:

QString QString::fromUtf16(const ushort * unicode, int taille = -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);
97
répondu Kamil Szot 2015-10-18 12:54:04

Si elle est compilée avec la compatibilité STL, QString a une méthode statique pour convertir un std::string en QString:

std::string str = "abc";
QString qstr = QString::fromStdString(str);
234
répondu sth 2015-10-22 10:16:20

Autre manière:

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 amener le std::string à se copier au cas où il n'y aurait pas de place pour ajouter le '\0' à la fin.

13
répondu shoosh 2013-09-12 20:14:08
std::string s = "Sambuca";
QString q = s.c_str();

Avertissement: Cela ne fonctionnera pas si le std::string contient \0. s.

10
répondu wilhelmtell 2014-05-09 20:26:43

Je suis tombé sur cette question parce que j'ai eu 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 bien. Cependant, lorsqu'il s'agit de chaînes dans Windows qui peuvent également contenir d'autres caractères, comme les umlauts 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 à traiter avec de telles chaînes, alors les réponses ci-dessus fonctionneront bien.

3
répondu Devolus 2014-09-17 15:02:36

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

Sortie

"hello !"
"10"
"5.42"
5
0
répondu Gabriel de Grimouard 2015-05-02 11:19:42

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

De toute façon, vous utilisez le même constructeur, comme documenté 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 un std::string, vous obtenez char* pour le tampon et le passer à la QString constructeur:

std::string name2("Stack Overflow");
QString qname2(name2.c_str());
0
répondu gavinb 2015-09-02 12:50:19