QStringをstd :: stringに変換する方法は?


229

私はこのようなことをやろうとしています:

QString string;
// do things...
std::cout << string << std::endl;

しかし、コードはコンパイルされません。qstringの内容をコンソールに出力する方法(デバッグなどの理由で)どのように変換QStringするのstd::stringですか?

回答:


223

変換するときに忘れてはならないことの一つQStringには、std::string事実であるQString一方、UTF-16でエンコードされているstd::string任意のエンコーディングを持っていることがあります...。

したがって、最善の方法は次のいずれかです。

QString qs;

// Either this if you use UTF-8 anywhere
std::string utf8_text = qs.toUtf8().constData();

// or this if you're on Windows :-)
std::string current_locale_text = qs.toLocal8Bit().constData();

コーデックを指定した場合、推奨される(受け入れられる)メソッドが機能する可能性があります。

参照:http : //doc.qt.io/qt-5/qstring.html#toLatin1


これは安全ではなく、適切な方法よりも少し遅いです。スタック上に作成されたQByteArrayのデータにアクセスしています。QByteArrayのデストラクタは、STL文字列のコンストラクタの前に呼び出すことができます。ヘルパー関数を作成する最も安全な方法。 static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
Vitali

17
@Vitaliは正しくありません。「STL文字列のコンストラクタの前にQByteArrayのデストラクタが呼び出される可能性があります」という記述は正しくありません。それらが作成されたポイントが含まれています。そして、そこにある完全な表現std::string utf8_text = qs.toUtf8().constData();だから、あなたの発言は正しくありません
Artyom

それは本当です-私はconst char * x = qs.ToUtf8()。constData()について考えていました。それでも、qs.toStdString()を呼び出すだけの方が簡単ではないですか?
Vitali

6
@Vitaliいいえ。latin1以外の文字は失われます。これを試してください:QString s = QString::fromUtf8("árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP"); std::cout << s.toStdString() << std::endl; std::cout << s.toUtf8().constData() << std::endl;。1つ目は正しくなく、2つ目は完璧です。これをテストするには、utf8端末が必要です。
ノーリスト

3
何の価値があるのか.toStdString()、私にとっては、QStringの内容(latin1でないかどうか)に関係なく、常にパイプオペレーターでアクセス違反が発生します。これは、Qtの4.8.3 / MSVC ++ 10 / Winの7の上にある
ダニエル正気

269

以下を使用できます。

QString qs;
// do things
std::cout << qs.toStdString() << std::endl;

内部的にQString :: toUtf8()関数を使用してstd :: stringを作成するため、Unicodeでも安全です。リファレンスドキュメントですQString


73
Qt 5.0以降でQString::toStdString()は、を使用QString::toUtf8()して変換を実行するため、文字列のUnicodeプロパティは失われません(qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString)。
Emile Cormier 2013

そして、あなたがのソースコードをチェックしたいならQString::toStdStringここにあります。
トゥガ

1
それが本当にUnicodeプロパティを失うかどうかを確認するためにどのようにテストできますか?Unicode文字(英語以外の言語など)を使用しても問題ありませんか?
Yousuf Azad

35

最終的な目的がコンソールにデバッグメッセージを取得することである場合は、qDebug()を使用できます。

次のように使用できます

qDebug()<<string;内容をコンソールに出力しますます。

この方法はstd::string、デバッグメッセージのためだけに変換するよりも優れています。


1
qDebug()は、より多くのQtタイプをサポートするため、はるかに優れています。
Kamil Klimek

24
QString qstr;
std::string str = qstr.toStdString();

ただし、Qtを使用している場合:

QTextStream out(stdout);
out << qstr;

質問する前に<< qstrを最初に試しましたが、コンパイルできませんでした。ただし、qstr.toStdString()で動作します。
2010年

2
そうは思いません。QTextString(stdout)<< qstrではなく、std :: cout << qstrを試しました
chris

18

最良の方法は、operator <<をオーバーロードして、出力可能な型を想定している任意のライブラリにQStringを型として渡すことができるようにすることです。

std::ostream& operator<<(std::ostream& str, const QString& string) {
    return str << string.toStdString();
}

3
なぜ反対票を投じるのですか?それは私の場合はやり過ぎですが、誰が知っているかは、(私または他の誰かにとって)役に立つかもしれません。
2010年

Qtには文字列の動作を変更する癖があるため、これが好きです。これにより、変換が1か所にまとめられます。
Den-Jason




0
 QString data;
   data.toStdString().c_str();

xstringのVS2017コンパイラで例外をスローすることさえできます

 ~basic_string() _NOEXCEPT
        {   // destroy the string
        _Tidy_deallocate();
        }

正しい方法(安全-例外なし)は、上記のArtyomからの説明です。

 QString qs;

    // Either this if you use UTF-8 anywhere
    std::string utf8_text = qs.toUtf8().constData();

    // or this if you're on Windows :-)
    std::string current_locale_text = qs.toLocal8Bit().constData();

-1

これを試して:

#include <QDebug>
QString string;
// do things...
qDebug() << "right" << string << std::endl;

1
質問は非常に明確です:QStringを出力しないでstd :: stringに変換します。
eyllanesc

@eyllanescの質問テキストには、「qstringのコンテンツをコンソールに出力する方法は?」、OPがstd :: stringへの変換が唯一の方法であると想定しているようです。同時に2つの質問が出されます。
MM

@MMタイトルの質問に「QStringをstd :: stringに変換する方法」と記載されているため、質問は不明瞭なようです。、たぶんそれはXY問題です。
eyllanesc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.