Comment convertir QString en std :: string?

229

J'essaie de faire quelque chose comme ça:

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

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

augustin
la source

Réponses:

223

Une des choses dont vous devez vous rappeler lors de la conversion QStringen std::stringest le fait qu'il QStringest encodé en UTF-16 alors que std::string... Peut avoir des encodages.

Le mieux serait donc:

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

Artyom
la source
Ce n'est pas sûr et est légèrement plus lent que la bonne façon. 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. Le moyen le plus sûr de créer une fonction d'assistance. static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
Vitali
17
@Vitali n'est 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 dernière étape de l'évaluation de l'expression complète (1.9) qui (lexicalement) contient le point où ils ont été créés. Et l'expression complète qu'il y a std::string utf8_text = qs.toUtf8().constData();Donc votre déclaration n'est pas correcte
Artyom
C'est vrai - je pensais à const char * x = qs.ToUtf8 (). ConstData (). N'est-il pas plus facile d'appeler simplement qs.toStdString ()?
Vitali
6
@Vitali Non. Cela perd des caractères non latins1. Essayez ceci: QString s = QString::fromUtf8("árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP"); std::cout << s.toStdString() << std::endl; std::cout << s.toUtf8().constData() << std::endl;. Le premier est incorrect, le second est parfait. Vous avez besoin d'un terminal utf8 pour tester cela.
Notinlist
3
Pour ce que ça vaut, .toStdString()pour moi, il y a toujours une violation d'accès chez l'opérateur de pipe, quel que soit le QStringcontenu de (non-latin1 ou non). C'est sur Qt 4.8.3 / MSVC ++ 10 / Win 7.
Daniel Saner
269

Vous pouvez utiliser:

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

Il utilise en interne la fonction QString :: toUtf8 () pour créer std :: string, il est donc également sûr pour Unicode. Voici la documentation de référence pour QString.

Pablo Santa Cruz
la source
73
Depuis Qt 5.0, QString::toStdString()utilise maintenant QString::toUtf8()pour effectuer la conversion, donc les propriétés Unicode de la chaîne ne seront pas perdues ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString ).
Emile Cormier
Et si vous voulez vérifier le code source QString::toStdString, le voici .
thuga
1
Comment puis-je tester pour voir si elle perd effectivement la propriété Unicode? Est-ce que l'utilisation de caractères Unicode (par exemple, dire d'une langue autre que l'anglais) fera l'affaire?
Yousuf Azad
35

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

Vous pouvez utiliser comme,

qDebug()<<string;qui imprimera le contenu sur la console .

Cette méthode est meilleure que de la convertir std::stringuniquement pour le débogage des messages.

liaK
la source
1
qDebug () serait beaucoup mieux, car il prend en charge plus de types Qt.
Kamil Klimek
24
QString qstr;
std::string str = qstr.toStdString();

Cependant, si vous utilisez Qt:

QTextStream out(stdout);
out << qstr;
chris
la source
J'avais essayé << qstr d'abord, avant de demander, mais ça n'a pas compilé. Cela fonctionne cependant avec qstr.toStdString ().
August
2
Je ne pense pas. Vous avez essayé std :: cout << qstr, pas QTextString (stdout) << qstr;
chris
18

La meilleure chose à faire serait de surcharger l'opérateur << vous-même, afin que QString puisse être passé en tant que type à n'importe quelle bibliothèque attendant un type capable de sortie.

std::ostream& operator<<(std::ostream& str, const QString& string) {
    return str << string.toStdString();
}
Chiot
la source
3
Pourquoi les votes négatifs, les amis? C'est une exagération dans mon cas, mais qui sait, cela pourrait être utile (pour moi ou quelqu'un d'autre).
augustin
J'aime ça parce que Qt a l'habitude de changer la façon dont ses cordes fonctionnent - et cela met la conversion en un seul endroit.
Den-Jason
12

Une alternative à la proposition:

QString qs;
std::string current_locale_text = qs.toLocal8Bit().constData();

pourrait être:

QString qs;
std::string current_locale_text = qPrintable(qs);

Voir la documentation qPrintable , une macro fournissant un caractère const * de QtGlobal.

flokk
la source
2
cela fonctionne même avec un ensemble Qt-Build avec -no-stl-Option. plus d'infos
Senči
8

La manière la plus simple serait QString::toStdString().

shaveenk
la source
2

Vous pouvez l'utiliser;

QString data;
data.toStdString().c_str();
Hafsa Elif Özçiftci
la source
veuillez ajouter quelques détails sur l'erreur et pourquoi votre réponse fonctionne
Anantha Raju C
0
 QString data;
   data.toStdString().c_str();

pourrait même lever l'exception sur le compilateur VS2017 dans xstring

 ~basic_string() _NOEXCEPT
        {   // destroy the string
        _Tidy_deallocate();
        }

la bonne façon (sécurisé - sans exception) est comment expliqué ci-dessus d'Artyom

 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();
JPM
la source
-1

Essaye ça:

#include <QDebug>
QString string;
// do things...
qDebug() << "right" << string << std::endl;
wudongliang
la source
1
La question est très claire: convertir QString en std :: string, pas pour l'imprimer.
eyllanesc
@eyllanesc le texte de la question dit "Comment sortir le contenu de qstring dans la console?" , il semble que OP suppose que la conversion en std :: string est le seul moyen. Il s'agit en fait de deux questions posées à la fois.
MM
@MM La question ne semble pas claire puisque la question dans le titre dit Comment convertir QString en std :: string? , C'est peut-être un problème XY.
eyllanesc