2010-03-26 17 views
59

Stavo cercando di convertire un tipo QString in char * con i seguenti metodi, ma non sembrano funzionare.Conversione QString in 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()); 

È possibile elaborare l'errore possibile con questo metodo o fornire un metodo alternativo?

+0

Il vostro esempio funziona bene per me, dov'è il problema? – Viesturs

+2

Ci scusiamo per il mio inglese, ma perché non è giusto usare questo approccio? 'QString s (" alcuni "); printf (reinterpret_cast (s.data())); ' –

risposta

75

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

Così forse si riscontrano altri problemi. Come esattamente non funziona?

+8

' const char * 'e' char * 'non sono dello stesso tipo. –

+2

@LightnessRacesinOrbit: scrivere sui contenuti di QString senza che lo si conosca è un'idea orribile, quindi naturalmente 'const char *' è ciò che può essere realmente ottenuto. L'utente è libero di copiare i dati in un buffer scrivibile. –

+1

Sono completamente d'accordo. Comunque, la domanda posta su 'char *', non 'char const *', e la tua risposta semplicemente ignora quel fatto senza menzione. –

1

La stringa potrebbe contenere caratteri non Latin1, che porta a dati non definiti. Dipende da cosa intendi per "non sembra funzionare".

32

Forse

my_qstring.toStdString().c_str();

o più sicuro, come sottolinea Federico:

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

E 'tutt'altro che ottimale, ma farà il lavoro.

+3

Questo rovinerà i caratteri Unicode. Una soluzione compatibile con Unicode: http://stackoverflow.com/a/4644922/238387 – jlstrecker

+9

Questo metodo è molto pericoloso e non dovrebbe essere utilizzato: 'toStdString()' restituisce un nuovo oggetto 'std :: string' e quindi il puntatore ai dati interni 'const char *' è ottenuto. Tuttavia, l'oggetto stringa viene immediatamente distrutto dopo questa istruzione, quindi il puntatore del risultato probabilmente non ha un indirizzo valido se lo si utilizza in un'istruzione successiva. – RicoRico

6

risposta di David funziona bene se si sta utilizzando solo per l'output su un file o la visualizzazione sullo schermo, ma se una funzione o una libreria richiede un char * per l'analisi, allora questo metodo funziona meglio:

// 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

Il modo più semplice per convertire un QString per char * è qPrintable(const QString& str), che è una macro espansione per str.toLocal8Bit().constData().

+0

Questo mi aiuta con QObject :: tr cosa, grazie. – Joel

+0

Perché questa non è una risposta più popolare?Ho appena saputo qualcosa di questo accidentalmente mentre spuntavo intorno alla sorgente Qt, ed è esattamente quello che fanno. – Phlucious

+1

@Phlucious, perché: 1) 'qPrintable' restituisce' const char * 'not' char * ',' str.toLocal8Bit(). Data() 'restituisce' char * '. 2) Il puntatore a 'const char *' diventa non valido non appena si preme un punto e virgola nell'istruzione in cui è stato usato 'qPrintable'. Quindi 'const char * c_ptr = s.toLocal8Bit(). ConstData();' non ha alcun senso. – WindyFields

1

la soluzione corretta sarebbe come questo

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

Dimenticate di utilizzare il casting in stile C. – kyb