Conversion de QString en char* [dupliquer]

possibilité de dupliquer:

QString to char conversion

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

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

20
demandé sur Community 2011-03-31 23:29:15
la source

2 ответов

Voir ici, Comment puis-je convertir un QString en char* et vice versa?

afin de convertir un QString en char*, alors vous devez d'abord obtenir un latin1 représentation de la chaîne par appelant toLatin1() sur elle qui sera de retour d'un QByteArray. Ensuite, les données d'appel() sur le QByteArray pour obtenir un pointeur pour les données stockées dans le tableau d'octets. Voir la documentation:

https://doc.qt.io/qt-5/qstring.html#toLatin1 https://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();
}

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

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

fera planer l'application comme le QByteArray n ' a pas été conservé et par conséquent, aucune existe plus

pour convertir un char* en QString you peut utiliser le constructeur QString qui prend un QLatin1String, E. g:

QString string = QString(QLatin1String(c_str2)) ;

voir la documentation:

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

bien sûr, j'ai découvert qu'il y a un autre moyen de ce précédente donc réponse :

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();
45
répondu Daniel Brunner 2018-04-11 09:54:17
la source

, Vous pourriez utiliser QFile plutôt que std::fstream.

QFile           file(qString);

convertir alternativement la chaîne Q en un caractère * comme suit:

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

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

comme noté par @0A0D ci-dessus: ne pas stocker le char* dans une variable sans obtenir également une copie locale du QByteArray.

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

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

1
répondu Martin York 2011-04-01 01:01:20
la source

Autres questions sur