可能性のある複製:
QStringからcharへの変換
私はコンピューターのパスとしてchar *引数を与える関数(STLのfopen)を持っていますが、それが機能しないようにその場所でQStringを使用しなければなりません。
この問題を解決するには、QStringをchar *に変換するにはどうすればよいですか?
QStringをchar *に、またはその逆に変換するにはどうすればよいですか? を参照してください。
QStringをchar *に変換するには、最初にtoLatin1()を呼び出してQByteArrayを返す文字列のlatin1表現を取得する必要があります。次に、QByteArrayでdata()を呼び出して、バイト配列に格納されているデータへのポインターを取得します。ドキュメントを参照してください。
https://doc.qt.io/qt-5/qstring.html#toLatin1https://doc.qt.io/qt-5/qbytearray.html#data
デモについては、次の例を参照してください。
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(); }
次のような呼び出しでdata()を呼び出す前に、bytearrayを保存する必要があることに注意してください。
const char *c_str2 = str2.toLatin1().data();
qByteArrayが保存されておらず、存在しないため、アプリケーションがクラッシュします
Char *をQStringに変換するには、QLatin1Stringを受け取るQStringコンストラクターを使用できます。例:
QString string = QString(QLatin1String(c_str2)) ;
ドキュメントを参照してください。
もちろん、私はこれから別の方法があることを発見しました previous 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();
Std :: fstreamではなく QFile を使用できます。
QFile file(qString);
または、次のようにQStringをchar *に変換します。
std::ifstream file(qString.toLatin1().data());
QString はUTF-16であるため、ここではtoLatin1()に変換されますが、QStringにはtoUtf8()を含むいくつかの異なる変換があります(UTF-8を使用しているファイルシステムを確認してください)。
上記の@ 0A0Dで述べたように、do n'tQByteArrayのローカルコピーも取得せずに、char *を変数に格納します。
char const* fileName = qString.toLatin1().data();
std::ifstream file(fileName); // fileName not valid here.
これは、toLatin1()がQByteArrayのオブジェクトを返すためです。実際には変数にバインドされていないため、式の最後で一時的に破棄されます。したがって、ここでdata()を呼び出すと、「;」の後に存在しない内部構造体へのポインタが返されます。