2010-03-26 36 views
59

Intenté convertir un QString en tipo * por los siguientes métodos, pero parece que no funcionan.Conversión de QString a char *

//QLineEdit *line=new QLineEdit();{just to describe what is line here} 

QString temp=line->text(); 
char *str=(char *)malloc(10); 
QByteArray ba=temp.toLatin1(); 
strcpy(str,ba.data()); 

¿Se puede elaborar la posible falla con este método, o dar un método alternativo?

+0

Su ejemplo me da buenos resultados, ¿dónde está el problema? – Viesturs

+2

Perdón por mi inglés, pero ¿por qué no está bien usar ese enfoque? 'QString s (" algunos "); printf (reinterpret_cast (s.data())); ' –

Respuesta

75

Bueno, el Qt FAQ dice:

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

Así que tal vez usted está teniendo otros problemas. ¿Cómo exactamente esto no funciona?

+8

' const char * 'y' char * 'no son del mismo tipo. –

+2

@LightnessRacesinOrbit: escribir en los contenidos de QString sin saber que es una idea horrible, por lo tanto, por supuesto 'const char *' es lo que realmente se puede obtener. El usuario puede copiar los datos en un buffer editable. –

+1

Estoy completamente de acuerdo. Sin embargo, la pregunta hecha sobre 'char *', no 'char const *', y su respuesta simplemente ignora ese hecho sin mencionarlo. –

1

Su cadena puede contener caracteres no latinos1, lo que conduce a datos no definidos. Depende de lo que quieras decir con "parece que no funciona".

32

Tal

my_qstring.toStdString().c_str();

o más seguros, como señala Federico:

std::string str = my_qstring.toStdString(); 
const char* p = str.c_str(); 

Está lejos de ser óptimo, pero hará el trabajo.

+3

Esto ensuciará los caracteres Unicode. Una solución amigable para Unicode: http://stackoverflow.com/a/4644922/238387 – jlstrecker

+9

Este método es muy peligroso y no se debe usar: 'toStdString()' devuelve un nuevo objeto 'std :: string' y luego el puntero a los datos internos 'const char *' se obtiene. Sin embargo, el objeto de cadena se destruye inmediatamente después de esta instrucción, por lo que el puntero de resultado probablemente no tenga una dirección válida si la usa en una declaración posterior. – RicoRico

6

la respuesta de David funciona bien si sólo se está utilizando para dar salida a un archivo o mostrar en la pantalla, pero si una función o una biblioteca requiere un char * para el análisis, entonces este método funciona mejor:

// copy QString to char* 
QString filename = "C:\dev\file.xml"; 
char* cstr; 
string fname = filename.toStdString(); 
cstr = new char [fname.size()+1]; 
strcpy(cstr, fname.c_str()); 

// function that requires a char* parameter 
parseXML(cstr); 
23

La forma más fácil de convertir un QString a char * es qPrintable(const QString& str), que es una macro ampliando a str.toLocal8Bit().constData().

+0

Esto me ayuda con la cosa QObject :: tr, gracias. – Joel

+0

¿Por qué no es esta una respuesta más popular?Acabo de enterarme de esto por accidente mientras hurgo en la fuente de Qt, y eso es exactamente lo que hacen. – Phlucious

+1

@Phlucious, porque: 1) 'qPrintable' devuelve' const char * 'not' char * ',' str.toLocal8Bit(). Data() 'devuelve' char * '. 2) El puntero a 'const char *' deja de ser válido tan pronto como se toca un punto y coma en la instrucción donde se utilizó 'qPrintable'. Entonces 'const char * c_ptr = s.toLocal8Bit(). ConstData();' no tiene ningún sentido. – WindyFields

1

la solución correcta sería así

QString k; 
    k = "CRAZYYYQT"; 
    char ab[16]; 
    sprintf(ab,"%s",(const char *)((QByteArray)(k.toLatin1()).data())); 
    sprintf(ab,"%s",(const char *)((QByteArray)(k.toStdString()).data())); 
    sprintf(ab,"%s",(const char *)k.toStdString().c_str() ); 
    qDebug()<<"--->"<<ab<<"<---"; 
+0

Olvídate de utilizar el estilo C de fundición. – kyb

Cuestiones relacionadas