20

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

この 2 つの世界をつなぐ最善の方法は何ですか?

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

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

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

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

4

3 に答える 3

22

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

両方の STL ヘッダーが同じかどうかわからない場合は、次を使用しますQString::fromWCharArray

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

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

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;
    ...
};

そして、あなたは以下を含むSTLを持っていますstd::wstring:

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

あなたがQtにあなたを与えるなら、それはポインタを文字列の長さとしてstd::wstring解釈し、m_the_end

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

于 2013-02-06T10:19:11.717 に答える
2

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

class foo
{
public:
   operator QString(std::wstring& ws)
   {
       return QString::fromStdWString(ws);
   }
}
于 2013-02-06T10:13:12.657 に答える
0

インライン関数QString toQString(std::wstring string)を作成して、「入力を少なく」するかもしれません...

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

スーロン ザイ

于 2013-02-06T10:11:06.187 に答える