web-dev-qa-db-ja.com

QStringからchar *への変換

可能性のある複製:
QStringからcharへの変換

私はコンピューターのパスとしてchar *引数を与える関数(STLのfopen)を持っていますが、それが機能しないようにその場所でQStringを使用しなければなりません。

この問題を解決するには、QStringをchar *に変換するにはどうすればよいですか?

21
woody

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

ドキュメントを参照してください。

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

もちろん、私はこれから別の方法があることを発見しました 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();
47
user195488

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()を呼び出すと、「;」の後に存在しない内部構造体へのポインタが返されます。

2
Martin York