web-dev-qa-db-ja.com

std :: wstringをQStringに変換する最良の方法

私は現在、より大きなプロジェクトに取り組んでいます。「ロジック」は標準のC++で実装され、すべての文字列はstd::wstringで処理され、UI部分はQtを使用して実装されるため、必然的にQString(ボーナス質問:これは本当ですか?).

これらの2つの世界を接続するための最良の方法は何ですか?

私は私が次のようなものを使用できることを知っています

std::wstring wideString;
QString qtString = QString::fromStdWString(wideString);

しかし、タイピングを少なくしてより良い方法があるかどうか疑問に思っています。ユーザー定義のオペレーターが頭に浮かびましたが、私は自分でそれに取り組むのに十分な経験がありません。

誰かが私を正しい方向に向けることができれば嬉しいです。

17
mort

Qtがプロジェクトとまったく同じSTLヘッダーでコンパイルされている場合は、QString::fromStdWStringbut(!!!)を使用することをお勧めします。そうでない場合は、バグを見つけて、たくさんの楽しみを得ることができます。

両方のSTLヘッダーが同じであるかどうかわからない場合は、QString::fromWCharArrayを使用してください。

std::wstring wideString;
QString qtString = QString::fromWCharArray( wideString.c_str() );

更新: @ juzzlinへの回答:
Qtが次のstd::wstringを含むSTLでビルドされたと想像してみましょう。

class wstring { // I know, that there's no such class, but I'm shure you'll understand what I want to say
    wchar_t * m_ptr;
    size_t m_length;
    ...
};

次のstd::wstringを含むSTLがあります。

class wstring {
    wchar_t * m_ptr;
    wchar_t * m_the_end;
    ...
};

std::wstringをQtに渡すと、m_the_endポインタが文字列の長さとして解釈されます。

バグを見つけて、たくさんの楽しみを得ることができます

20
borisbn

ユーザー定義の変換はあなたが探しているものだと思います。私が収集できるものから、次のようになります。

class foo
{
public:
   operator QString(std::wstring& ws)
   {
       return QString::fromStdWString(ws);
   }
}
2
Tony The Lion

インライン関数QString toQString(std::wstring string)を作成して、「入力しにくくする」.。

しかし正直に言うと...それは時々それを書くための大きな努力ではありません;)

とても長いザイ

0
Zaiborg