Лучший способ конвертировать std::wstring в QString

В настоящее время я работаю над более крупным проектом, где «логика» реализована на стандартном C++, при этом все строки обрабатываются с помощью std::wstring, а часть пользовательского интерфейса реализована с использованием Qt и, следовательно, обязательно QString (дополнительный вопрос: это правда?).

Как лучше всего соединить эти два мира?

Я знаю, что могу использовать что-то вроде

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

но мне интересно, есть ли более приятный способ с меньшим количеством ввода. Мне на ум пришел пользовательский оператор, но у меня недостаточно опыта, чтобы справиться с этим самостоятельно.

Был бы рад, если бы кто-нибудь мог указать мне в правильном направлении.


person mort    schedule 06.02.2013    source источник
comment
Вы когда-нибудь читали QString, std::wstring и встроенный wchar_t?   -  person Jesse Good    schedule 06.02.2013
comment
Вы приняли ответ, в котором описано только преобразование в одном направлении. Это был твой вопрос? Тогда вам, вероятно, следует изменить заголовок, чтобы он не вводил в заблуждение (для тех, кто надеется найти ответ о преобразовании в другом направлении).   -  person imz -- Ivan Zakharyaschev    schedule 02.07.2015


Ответы (3)


Рекомендуется использовать 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;
    ...
};

Если вы передадите std::wstring Qt, он будет интерпретировать указатель m_the_end как длину строки и

можно получить массу удовольствия, поймав жука

person borisbn    schedule 06.02.2013
comment
Что произойдет, если не будут использоваться точно такие же заголовки STL? И почему в этом случае QString::fromWCharArray() является лучшим решением? - person juzzlin; 13.03.2015
comment
fromStdWString встроен в qstring.h и имеет реализацию: return fromWCharArray(s.data(), int(s.size())); Таким образом, его можно безопасно использовать. - person rmflow; 08.10.2015
comment
@rmflow Да, вы правы, но нет гарантии, что wstring::data и wstring::size тоже встроены. - person borisbn; 12.10.2015
comment
@borisbn не имеет значения, так как они скомпилированы из заголовка (в вашем коде). Вы могли бы сами написать fromWCharArray(s.data(), int(s.size())); вместо вызова fromStdWString и результат был бы таким же. - person rmflow; 12.10.2015

Я думаю, что преобразование, определяемое пользователем, — это то, что вам нужно, и, насколько я могу судить, оно должно выглядеть примерно так:

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

может быть, сделать встроенную функцию QString toQString(std::wstring string), чтобы "меньше печатать"...

но, если честно ... писать это время от времени совсем не сложно ;)

так долго зай

person Zaiborg    schedule 06.02.2013