如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章