如何将ATL/MFC CString转换为QString?

Hay*_*tuk 5 c++ qt mfc atl cstring

鉴于项目的编码可能是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
Run Code Online (Sandbox Code Playgroud)

你认为它有效吗?还有其他想法吗?

Cod*_*ray 7

您不需要将中间转换为a 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
Run Code Online (Sandbox Code Playgroud)

编辑:正如评论中所建议的那样,您必须wchar_t在项目的属性中禁用" 视为内置类型",以使上述代码在Visual Studio(源代码)中正确链接.

因为_UNICODE,我相信你也可以使用这个fromUtf16功能:

CString c(_T("SOME TEXT"));
QString q = QString::fromUtf16(c.GetBuffer(), c.GetLength());
Run Code Online (Sandbox Code Playgroud)