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

Posted

技术标签:

【中文标题】如何将 ATL/MFC CString 转换为 QString?【英文标题】:How do I convert an ATL/MFC CString to a QString? 【发布时间】:2011-09-07 03:12:36 【问题描述】:

鉴于项目的编码可能是 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】:

您不需要到std::string 的中间转换。 CString 类可以被视为一个简单的 C 风格字符串;也就是一个字符数组。您所要做的就是将其转换为LPCTSTR

一旦你有了它,你只需要根据CString 中的字符是char 还是wchar_t 类型来创建QString 对象。对于前者,您可以使用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

编辑: 如 cmets 中所建议,您必须在项目的属性中禁用“将 wchar_t 视为内置类型”,才能使上述代码在 Visual Studio 中正确链接( source)。

对于_UNICODE,相信你也可以使用fromUtf16 function:

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

【讨论】:

谢谢 :) 关于为什么 QString::fromWCharArray 没有链接的任何想法?奇怪的是,它是链接器唯一找不到的函数... @Ali:也许您使用的是不包含该功能的旧版 Qt?当您留下该评论时,我添加了另一个可能的解决方案。你可以试试。 不不,我找到了原因。它是here @Ali:令人着迷,我从来没有想到过。仍然不确定我是否理解为什么它是必要的。我猜 VS 编译器对待 wchar_t 的方式与 Qt 的预期不同。 是的,我想是的。我猜 wchar_t 是一些 typedef,当它是内置的时,链接器会查找采用内置类型参数而不是 typedef 类型参数的函数。我相信这就是它没有链接的原因。

以上是关于如何将 ATL/MFC CString 转换为 QString?的主要内容,如果未能解决你的问题,请参考以下文章

VC学习笔记---ATL MFC CLR三个库的区别

如何将 CString 转换为 CByteArray?

如何将 CString 转换为字节

如何将char数组转换为CString

mfc中,如何将CString 转换成 string

如何将CString转换为byte []数组? [重复]