鉴于项目的编码可能是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
你觉得它有效吗?还有其他想法吗?
答案 0 :(得分:7)
您不需要将中间转换为std::string
。可以将CString
类视为简单的C风格字符串;也就是说,一个字符数组。您所要做的就是将其投射到LPCTSTR
。
完成后,您只需创建QString
对象,具体取决于CString
中的字符是char
还是wchar_t
。对于前者,您可以使用standard constructors for QString
中的一个,对于后者,您可以使用fromWCharArray
function。
类似下面的代码(未经测试,我没有安装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中正确链接工作室(source)。
对于_UNICODE
,我相信您也可以使用fromUtf16
function:
CString c(_T("SOME TEXT"));
QString q = QString::fromUtf16(c.GetBuffer(), c.GetLength());