web-dev-qa-db-fra.com

QString to char * conversion

J'essayais de convertir un QString en type char * à l'aide des méthodes suivantes, mais elles ne semblent pas fonctionner.

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

75
mawia

Eh bien, le Qt FAQ dit:

int main(int argc, char **argv)
{
 QApplication app(argc, argv);
  QString str1 = "Test";
  QByteArray ba = str1.toLocal8Bit();
  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 ça marche pas?

102
Eli Bendersky

Peut être

my_qstring.toStdString().c_str();

ou plus sûr, comme le souligne Federico:

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

C'est loin d'être optimal, mais fera le travail.

43
davidnr

Le moyen le plus simple de convertir un QString en char * est qPrintable (const QString & str) , , Qui est une macro passant à str.toLocal8Bit().constData().

33
Robert

La réponse de David fonctionne bien si vous l'utilisez uniquement pour la sortie dans un fichier ou pour l'affichage à l'écran, mais si une fonction ou une bibliothèque nécessite un caractère * pour l'analyse, cette méthode fonctionne 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);
6
alex

ÉDITÉ

ça marche aussi

QString str ("Something");

char* ch = str.toStdString().C_str();
3
Shanks

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

2
gregseth

la solution correcte 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<<"<---";
2
sam

Si votre chaîne contient des caractères non-ASCII, il est préférable de le faire comme suit: s.toUtf8().data() (ou s->toUtf8().data())

0
AlexDarkVoid