2010-11-18 34 views
179

estoy tratando de hacer algo como esto:Cómo convertir QString a std :: string?

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

pero el código no compila. Cómo salida del contenido de QString en la consola (por ejemplo, para fines de depuración u otras razones)? Cómo convertir QString a std::string?

Respuesta

173

Una de las cosas que debe recordar al convertir a QStringstd::string es el hecho de que QString es UTF-16 codificados mientras std::string ... puede tener cualquier codificaciones.

Así que lo mejor sería que o bien:

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

El método sugerido (aceptado) puede funcionar si se especifica códec.

Ver: http://doc.qt.io/qt-5/qstring.html#toAscii

+0

Esto no es seguro y es un poco más lento que la forma correcta. Está accediendo a los datos de un QByteArray creado en la pila. El destructor para QByteArray se puede llamar antes del constructor de la cadena STL. La forma más segura de crear una función de ayuda. 'static inline std :: string toUtf8 (const QString & s) { \t QByteArray sUtf8 = s.toUtf8(); \t return std :: string (sUtf8.constData(), sUtf8.size()); } ' – Vitali

+14

@Vitali no es correcto. "El destructor para QByteArray se puede llamar antes del constructor de la cadena STL" no es una declaración correcta: Citando el estándar: 12.2.3 Los objetos temporales se destruyen como el último paso en la evaluación de la expresión completa (1.9) que (léxicamente) contiene el punto donde fueron creados. Y la plena expresión no es 'utf8_text std :: string = qs.toUtf8() constData();' Por lo que su afirmación no es correcta – Artyom

+0

eso es cierto - Estaba pensando en const char * x = qs.ToUtf8() constData..(). Aún así, ¿no es más fácil simplemente llamar a qs.toStdString()? – Vitali

202

que puede utilizar: documentación

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

Here's referencia para QString.

+0

Gracias. Funciona. – augustin

+0

Y gracias por el enlace a la documentación. :) – augustin

+0

No hay problema! ¡Buena suerte con QT! –

21
QString qstr; 
std::string str = qstr.toStdString(); 

Sin embargo, si usted está utilizando Qt:

QTextStream out(stdout); 
out << qstr; 
+0

Probé << qstr primero, antes de preguntar, pero no compiló. Sin embargo, funciona con qstr.toStdString(). – augustin

+1

No lo creo. Intentó std :: cout << qstr, no QTextString (stdout) << qstr; – chris

+0

¡Oh! ¡Ya veo! Voy a intentar eso. +1. – augustin

17

mejor que puede hacer sería sobrecargar el operador < < a sí mismo, de modo que QString se puede pasar como un tipo a cualquier biblioteca esperando una tipo de salida disponible.

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

¿Por qué los votos hacia abajo, amigos? Es un exceso en mi caso, pero quién sabe, podría ser útil (para mí o para otra persona). – augustin

+2

+1. gracias . – augustin

31

Si su objetivo final es conseguir que los mensajes a la consola de depuración, puede utilizar qDebug().

Se puede utilizar como,

qDebug()<<string; que imprimirá el contenido de la consola.

De esta manera es mejor que convertirlo en std::string sólo por el bien de los mensajes de depuración.

+0

+1 Gracias. qDebug() podría ser útil. – augustin

+1

qDebug() sería mucho mejor, ya que admite más tipos de Qt. –

9

Una alternativa a la propuso:

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

podrían ser:

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

Ver qPrintable documentation, una macro entrega de un const char * desde QtGlobal.

+1

esto funciona incluso con un Qt-Build con el conjunto de opciones '-no-stl'. [Algo más de información] (http://asmaloney.com/2011/11/code/qstringtostdstring-qstringfromstdstring-and-no-stl/) – Senad

7

La forma más sencilla sería string.toStdString()

0

Puede utilizar este;

QString data; 
data.toStdString().c_str(); 
+0

favor agregue algunos detalles sobre lo que el error fue y por qué funciona su respuesta –

Cuestiones relacionadas