web-dev-qa-db-fra.com

Conversion de QString en char *

Duplicata possible:
conversion de QString en char

J'ai une fonction (fopen en STL) qui donne un argument char * comme chemin dans mon ordinateur, mais je dois utiliser QString à cet endroit pour que cela ne fonctionne pas.

Comment puis-je convertir QString en char * pour résoudre ce problème?

21
woody

Voir ici à Comment puis-je convertir une QString en char * et vice versa?

Afin de convertir un QString en un char *, vous devez d'abord obtenir une représentation latin1 de la chaîne en appelant toLatin1 () dessus qui retournera un QByteArray. Appelez ensuite data () sur le QByteArray pour obtenir un pointeur sur les données stockées dans le tableau d'octets. Consultez la documentation:

https://doc.qt.io/qt-5/qstring.html#toLatin1https://doc.qt.io/qt-5/qbytearray.html#data

Voir l'exemple suivant pour une démonstration:

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

Notez qu'il est nécessaire de stocker le bytearray avant d'appeler data () dessus, un appel comme le suivant

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

fera planter l'application car le QByteArray n'a pas été stocké et n'existe donc plus

Pour convertir un char * en QString, vous pouvez utiliser le constructeur QString qui prend un QLatin1String, par exemple:

QString string = QString(QLatin1String(c_str2)) ;

Consultez la documentation:

https://doc.qt.io/qt-5/qlatin1string.html

Bien sûr, j'ai découvert qu'il y avait un autre moyen à cela précédent 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();
47
user195488

Vous pouvez utiliser QFile plutôt que std :: fstream.

QFile           file(qString);

Vous pouvez également convertir la QString en un caractère * comme suit:

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

QString est en UTF-16, il est donc converti en Latin1 () ici mais QString a quelques conversions différentes, y compris toUtf8 () (vérifiez votre système de fichiers, il peut utiliser UTF-8).

Comme indiqué par @ 0A0D ci-dessus: ne stockez pas le caractère * dans une variable sans obtenir également une copie locale de QByteArray.

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

En effet, toLatin1 () renvoie un objet de QByteArray. Comme il n'est pas réellement lié à une variable, c'est un temporaire qui est détruit à la fin de l'expression. Ainsi, l'appel à data () renvoie ici un pointeur sur une structure interne qui n'existe plus après le ';'.

2
Martin York