2011-03-31 22 views

Respuesta

44

Ver here at How can I convert a QString to char* and vice versa?

Con el fin de convertir un QString a un char *, entonces primero tiene que obtener una representación latin1 de la cadena por llamando toLatin1() en él que devolver una QByteArray. A continuación, llame a data() en QByteArray para obtener un puntero a los datos almacenados en la matriz de bytes. Ver la documentación:

http://qt.nokia.com/doc/qstring.html#toLatin1 http://qt.nokia.com/doc/qbytearray.html#data

Véase el siguiente ejemplo para una demostración :

int main(int argc, char **argv) 
{ 
QApplication app(argc, argv); 
    QString str1 = "Test"; 
    QByteArray ba = str1.toLatin1(); 
    const char *c_str2 = ba.data(); 
    printf("str2: %s", c_str2); 
    return app.exec(); 
} 

en cuenta que es necesario almacenar la bytearray antes de llamar a los datos() en es una llamada como la siguiente

const char *c_str2 = str2.toLatin1().data(); 

hará que el bloqueo de la aplicación como el QByteArray no se ha almacenado y por lo tanto, ya no existe

Para convertir un char * a un QString que puede utilizar el constructor QString que toma un QLatin1String, por ejemplo:

QString string = QString(QLatin1String(c_str2)) ; 

Consulte la documentación:

http://qt.nokia.com/doc/qlatin1string.html

Por supuesto, he descubierto que hay otra manera de este previous SO answer:

QString qs; 

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

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

Creo que la redacción debe cambiar. La sentencia 'const char * c_str2 = str2.toLatin1(). Data();' debería funcionar bien. Desafortunadamente después del ';' el QByteArray temporal creado por toLatin1() se ha destruido, por lo que 'c_str2' ahora tiene un puntero no válido. Por el contrario, podría usarlo en una llamada 'doStuff (str2.toLatin1(). Data());' ya que QByteArray no se destruye hasta que ';' Por lo tanto: 'printf (" str2:% s ", str2.toLatin1(). Data());' Debería estar bien. –

+0

@Martin: solo estoy citando a Qt. –

+1

Esto. Pasé la mitad de hoy depurando un problema causado por la destrucción del QByteArray subyacente. Es un verdadero dolor tener que almacenar la matriz de bytes, pero parece ser necesario. – misha

1

Usted podría utilizar QFile en lugar de std :: fstream.

QFile   file(qString); 

convertir Alternativamente, el QString en un char * como sigue:

std::ifstream file(qString.toLatin1().data()); 

El QString es en UTF-16 toLatin1 por lo que se convierte() aquí, pero QString tiene un par de diferentes conversiones incluyendo toUtf8() (verifique su sistema de archivos puede usar UTF-8).

Según lo observado por @ 0A0D anterior: no almacene el char * en una variable sin obtener también una copia local de QByteArray.

char const*  fileName = qString.toLatin1().data(); 
std::ifstream file(fileName); // fileName not valid here. 

Esto es porque toLatin1() devuelve un objeto de QByteArray. Como en realidad no está vinculado a una variable, es un temporal que se destruye al final de la expresión. Por lo tanto, la llamada a data() aquí devuelve un puntero a una estructura interna que ya no existe después del ';'.

Cuestiones relacionadas