Как преобразовать строку ATL / MFC в строку QString? - PullRequest
5 голосов
/ 02 июня 2011

Учитывая, что кодировка проекта, вероятно, является Unicode (но не точно), каков наилучший способ преобразования ATL :: CString в QString?

То, о чем я думал, это:

CString c(_T("SOME_TEXT"));
//...
std::basic_string<TCHAR> intermediate((LPCTSTR)c);
QString q;

#ifdef _UNICODE 
q = QString::fromStdWString(intermediate);
#else
q = QString::fromStdString(intermediate);
#endif

Как вы думаете, это работает?Есть другие идеи?

1 Ответ

7 голосов
/ 02 июня 2011

Вам не нужно промежуточное преобразование в std::string. Класс CString можно рассматривать как простую строку в стиле C; то есть массив символов. Все, что вам нужно сделать, это привести его к LPCTSTR.

И когда у вас это есть, вам просто нужно создать объект QString в зависимости от того, относятся ли символы в CString к типу char или wchar_t. В первом случае вы можете использовать один из стандартных конструкторов для QString, а во втором - функцию fromWCharArray .

Что-то вроде следующего кода (не проверено, у меня больше не установлено Qt):

CString c(_T("SOME_TEXT"));
QString q;

#ifdef _UNICODE 
q = QString::fromWCharArray((LPCTSTR)c, c.GetLength());
#else
q = QString((LPCTSTR)c);
#endif

Редактировать: Как предлагается в комментариях, вы должны отключить «Обрабатывать wchar_t как встроенный тип» в свойствах вашего проекта, чтобы получить приведенный выше код для правильной ссылки в Visual Studio ( источник ).

Для _UNICODE, я полагаю, вы также можете использовать функцию fromUtf16 :

CString c(_T("SOME TEXT"));
QString q = QString::fromUtf16(c.GetBuffer(), c.GetLength());
...