文字列をQStringに変更する方法は?


回答:


154

文字列とは std::string、このメソッドでそれを行うことができます:

QString QString :: fromStdString(const std :: string&str)

std::string str = "Hello world";
QString qstr = QString::fromStdString(str);

文字列である場合は、ASCIIエンコードされていることを意味します const char *場合は、このメソッドを使用できます。

QString QString :: fromAscii(con​​st char * str、int size = -1)

const char* str = "Hello world";
QString qstr = QString::fromAscii(str);

QTextCodec :: codecForLocale()でconst char *読み取ることができるシステムエンコーディングでエンコードした場合あなたは、このメソッドを使用する必要があります。

QString QString :: fromLocal8Bit(const char * str、int size = -1)

const char* str = "zażółć gęślą jaźń";      // latin2 source file and system encoding
QString qstr = QString::fromLocal8Bit(str);

const char *UTF8エンコードされている場合は、このメソッドを使用する必要があります。

QString QString :: fromUtf8(const char * str、int size = -1)

const char* str = read_raw("hello.txt"); // assuming hello.txt is UTF8 encoded, and read_raw() reads bytes from file into memory and returns pointer to the first byte as const char*
QString qstr = QString::fromUtf8(str);

const ushort *UTF16エンコードされた文字列を含める方法もあります。

QString QString :: fromUtf16(const ushort * unicode、int size = -1)

const ushort* str = read_raw("hello.txt"); // assuming hello.txt is UTF16 encoded, and read_raw() reads bytes from file into memory and returns pointer to the first byte as const ushort*
QString qstr = QString::fromUtf16(str);

1
`new 'でQStringを構築したくないでしょう。
rohanpm 2009年

@Rohan-コメントありがとうございます。これを私の答えから削除します。
Kamil Szot、2009年

質問には答えません。
CCoder

1
私はこれほど多くの反対投票で受け入れられた回答を見たことがありません。なぜ最高の投票された回答よりも良いもので著者が編集しないのですか?詳細を追加したいですか?それまでは、あと1つ-1をお楽しみください。
トマーシュZato -復活モニカ

3
これは修正されたようで、かなり良いので、これと他の+1の両方を与えました。
csl 2015年

242

STL互換でコンパイルされている場合QString静的メソッドがあります、a std::stringをa に変換するQString

std::string str = "abc";
QString qstr = QString::fromStdString(str);

3
私の意見では、これは実際には避けるべきです。QTがコンパイルされた標準ライブラリのバージョンが、コンパイルしているものとどういうわけか異なる場合、問題が発生します。で、QTとlibstdc ++の間に不要な依存関係が作成され、QTの他の場所には存在しません。
2013

@shoosh:それを避けるために、1つだけではできませんでしたQString qstr = QString(str.c_str());か?QString渡されたものをコピーするかどうかはわかりません。
Claudiu 2014年

@shoosh:互換性に関する懸念を理解しましたが、QStringとstd :: stringの両方にnull文字を含めることができます。 fromStdStringこれらを保存し、から構築し.c_strます。(そして、この質問に私を導いたのは、正確にこれを行う方法でした。)
Martin Bonnerはモニカ

@MartinBonner QByteArrayには、const char *と長さを取るctorがあります。QStringにはQByteArrayを取るctorがあります
2017年

13

別の方法:

std::string s = "This is an STL string";
QString qs = QString::fromAscii(s.data(), s.size());

これには、末尾にを追加する場所がない場合にがそれ自体をコピー.c_str()する可能性があるため、使用しないという利点があります。std::string'\0'


2
.c_str()による潜在的な隠しコピーについてのヒントをありがとう。
Trass3r 2013

c ++ 11では、これは問題ではなくなりました(で隠しコピー.c_str()
Steve Lorimer '16 / 10/18

1
C ++ 11以前は、潜在的な隠しコピーは純粋に理論的な可能性でした-実際にそれを行う実装はありませんでした。
Martin Bonnerがモニカをサポートする2017年

11
std::string s = "Sambuca";
QString q = s.c_str();

警告:にstd::string含まれている場合、これは機能しません\0


3

この質問に出くわしたのは、回答に従うときに問題があったためです。解決策をここに投稿します。

上記の例はすべて、ASCII値のみを含む文字列のサンプルを示しています。この場合、すべてが正常に機能します。ただし、Windowsで文字列を処理するときに、ドイツ語のウムラウトなどの他の文字も含めることができる場合、これらのソリューションは機能しません

そのような場合に正しい結果を与える唯一のコードは

std::string s = "Übernahme";
QString q = QString::fromLocal8Bit(s.c_str());

このような文字列を処理する必要がない場合は、上記の回答が適切に機能します。


これはstd :: stringではなく、文字列リテラルを使用したソースファイルのエンコーディングに依存しています。ソースファイルがUTF8の場合、それは機能しますが、次の呼び出しを中断しますfromLocal8Bit()
namezero

0

さらに、必要なものを変換するために、QVariantクラスを使用できます。

例えば:

std::string str("hello !");
qDebug() << QVariant(str.c_str()).toString();
int test = 10;
double titi = 5.42;
qDebug() << QVariant(test).toString();
qDebug() << QVariant(titi).toString();
qDebug() << QVariant(titi).toInt();

出力

"hello !"
"10"
"5.42"
5

0

文字列のようなC文字列ですかchar*、それともC ++ std::stringオブジェクトですか?

どちらの方法でも、QTリファレンスに記載されているのと同じコンストラクタを使用します。

通常のC文字列の場合は、メインコンストラクターを使用するだけです。

char name[] = "Stack Overflow";
QString qname(name);

の場合、バッファstd::stringにを取得し、char*それをQStringコンストラクタに渡します。

std::string name2("Stack Overflow");
QString qname2(name2.c_str());

1
OPは埋め込まれたNULLについて言及していませんが、十分に真実です。それが必要な場合は、を使用QByteArray::QByteArray (const char* data, int size)して最初にバッファーをラッパー化し、それをQStringコンストラクターに渡すことができます。
gavinb 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.