2010-03-26 48 views
59

J'essayais de convertir un type QString en caractère char * par les méthodes suivantes, mais elles ne semblent pas fonctionner.Conversion QString en 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()); 

Pouvez-vous élaborer le défaut possible avec cette méthode, ou donner une autre méthode?

+0

Votre exemple fonctionne très bien pour moi, où est le problème? – Viesturs

+2

Désolé pour mon anglais, mais pourquoi ce n'est pas correct d'utiliser une telle approche? 'QString s (" certains "); printf (reinterpret_cast (s.data())); ' –

Répondre

75

Eh bien, la Qt FAQ dit:

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

Alors peut-être que vous rencontrez d'autres problèmes. Comment exactement cela ne fonctionne-t-il pas?

+8

' const char * 'et' char * 'ne sont pas du même type. –

+2

@LightnessRacesinOrbit: écrire sur le contenu de QString sans le savoir est une idée horrible, donc bien sûr 'const char *' est ce qui peut vraiment être obtenu. L'utilisateur est libre de copier les données dans un tampon inscriptible. –

+1

Je suis complètement d'accord. Cependant, la question posée à propos de «char *», pas de «char const», et votre réponse ignore simplement ce fait sans mention. –

1

Votre chaîne peut contenir des caractères non Latin1, ce qui conduit à des données indéfinies. Cela dépend de ce que vous voulez dire par "ça ne semble pas fonctionner".

32

Peut-être

my_qstring.toStdString().c_str();

ou plus sûr, comme Federico souligne:

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

Il est loin d'être optimale, mais fera le travail.

+3

Cela va gâcher les caractères Unicode. Une solution conviviale Unicode: http://stackoverflow.com/a/4644922/238387 – jlstrecker

+9

Cette méthode est très dangereuse et ne devrait pas être utilisée: 'toStdString()' retourne un nouvel objet 'std :: string', puis le pointeur aux données internes 'const char *' est obtenu. Cependant, l'objet chaîne est immédiatement détruit après cette instruction, donc le pointeur de résultat n'a probablement pas d'adresse valide si vous l'utilisez dans une instruction suivante. – RicoRico

6

La réponse de David fonctionne très bien si vous ne l'utilisez que pour la sortie d'un fichier ou d'afficher sur l'écran, mais si une fonction ou d'une bibliothèque a besoin d'un char * pour l'analyse, cette méthode fonctionne le mieux:

// 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 meilleure façon de convertir un QString à char * est qPrintable(const QString& str), qui est une macro en expansion à str.toLocal8Bit().constData().

+0

Cela m'aide avec la chose QObject :: tr, merci. – Joel

+0

Pourquoi n'est-ce pas une réponse plus populaire?Je viens d'apprendre à ce sujet par hasard en piquant autour de la source Qt, et c'est exactement ce qu'ils font. – Phlucious

+1

@Phlucious, car: 1) 'qPrintable' renvoie' const char * 'pas' char * ',' str.toLocal8Bit(). Data() 'retourne' char * '. 2) Le pointeur sur 'const char *' devient invalide dès que vous tapez un point-virgule dans l'instruction où 'qPrintable' a été utilisé. Donc 'const char * c_ptr = s.toLocal8Bit(). ConstData();' n'a aucun sens. – WindyFields

1

La bonne solution serait comme ça

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

Oubliez d'utiliser le moulage de style C. – kyb