251 votes

Comment convertir QString en std::string ?

J'essaie de faire quelque chose comme ça :

QString string;
// do things...
std::cout << string << std::endl;

mais le code ne se compile pas. Comment afficher le contenu de qstring dans la console (par exemple, à des fins de débogage ou pour d'autres raisons) ? Comment convertir QString a std::string ?

301voto

Pablo Santa Cruz Points 73944

Vous pouvez utiliser :

QString qs;
// do things
std::cout << qs.toStdString() << std::endl;

Il utilise en interne la fonction QString::toUtf8() pour créer une chaîne de caractères std::string, donc il est également sûr pour l'Unicode. Voici la documentation de référence pour QString .

78 votes

À partir de Qt 5.0, QString::toStdString() utilise maintenant QString::toUtf8() pour effectuer la conversion, de sorte que les propriétés Unicode de la chaîne ne seront pas perdues ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString ).

0 votes

Et si vous voulez vérifier le code source de QString::toStdString , c'est ici .

1 votes

Comment puis-je tester pour voir s'il perd effectivement la propriété Unicode ? Est-ce que l'utilisation de caractères Unicode (par exemple d'une langue autre que l'anglais) fera l'affaire ?

241voto

Artyom Points 17387

Une des choses dont vous devez vous souvenir lors de la conversion QString a std::string est le fait que QString est encodé en UTF-16 alors que std::string ... Peut avoir n'importe quel codage.

Donc le mieux serait soit :

QString qs;

// Either this if you use UTF-8 anywhere
std::string utf8_text = qs.toUtf8().constData();

// or this if you're on Windows :-)
std::string current_locale_text = qs.toLocal8Bit().constData();

La méthode suggérée (acceptée) peut fonctionner si vous spécifiez le codec.

Voir : http://doc.qt.io/qt-5/qstring.html#toLatin1

1 votes

Ce n'est pas sûr et c'est légèrement plus lent que la méthode correcte. Vous accédez aux données d'un QByteArray créé sur la pile. Le destructeur du QByteArray peut être appelé avant le constructeur de la chaîne STL. La façon la plus sûre de créer une fonction d'aide. static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }

18 votes

@Vitali pas correct. "Le destructeur de QByteArray peut être appelé avant le constructeur de la chaîne STL" n'est pas une déclaration correcte : Citant la norme : 12.2.3 Les objets temporaires sont détruits comme la dernière étape de l'évaluation de l'expression complète (1.9) qui contient (lexicalement) le point où ils ont été créés. Et l'expression complète est std::string utf8_text = qs.toUtf8().constData(); Votre déclaration n'est donc pas correcte

0 votes

C'est vrai - je pensais à const char *x = qs.ToUtf8().constData(). Pourtant, n'est-il pas plus simple d'appeler qs.toStdString() ?

36voto

liaK Points 6045

Si votre but ultime est d'obtenir des messages de débogage sur la console, vous pouvez utiliser la méthode suivante qDebug() .

Vous pouvez utiliser comme,

qDebug()<<string; qui imprimera le contenu dans le fichier console .

Cette façon de faire est meilleure que de le convertir en std::string juste pour les messages de débogage.

1 votes

QDebug() serait bien meilleur, car il supporte plus de types de Qt.

25voto

chris Points 2493
QString qstr;
std::string str = qstr.toStdString();

Cependant, si vous utilisez Qt :

QTextStream out(stdout);
out << qstr;

0 votes

J'avais d'abord essayé << qstr, avant de demander, mais ça n'a pas compilé. Cela fonctionne avec qstr.toStdString(), cependant.

2 votes

Je ne pense pas. Vous avez essayé std::cout << qstr, et non QTextString(stdout) << qstr ;

18voto

Puppy Points 90818

La meilleure chose à faire serait de surcharger vous-même l'opérateur<<, de sorte que QString puisse être passé comme type à toute bibliothèque attendant un type pouvant être sorti.

std::ostream& operator<<(std::ostream& str, const QString& string) {
    return str << string.toStdString();
}

3 votes

Pourquoi ces votes négatifs, les gars ? C'est un peu exagéré dans mon cas, mais qui sait, cela pourrait être utile (à moi ou à quelqu'un d'autre).

0 votes

J'aime cela parce que Qt a l'habitude de changer la façon dont ses chaînes de caractères fonctionnent - et cela met la conversion en un seul endroit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X