如何将ATL/MFC CString转换为QString

How do I convert an ATL/MFC CString to a QString?

本文关键字:CString 转换 QString MFC ATL      更新时间:2023-10-16

考虑到项目的编码可能是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

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

您不需要到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());