> 文章列表 > MFC转QT踩坑记录

MFC转QT踩坑记录

MFC转QT踩坑记录

1、中文乱码

QT + msvc编译器版本默认编译的是字符串编码是ANSI,

而QTCreator默认创建的cpp字符串编码是UTF-8,然后msvc还是按ANSI去解析字符串常量,所以导致了中文乱码

解决方案:

使用notepad++把cpp编码从UTF-8转成 UTF-8带BOM

然后在pro加入下面脚本告诉msvc编译器,字符串常量是UTF-8编码,这样就不需要使用

QStringLiteral到处去包含字符串常量了
msvc {QMAKE_CFLAGS += /utf-8QMAKE_CXXFLAGS += /utf-8
}

2、API接口ANSI版本和Unicode版本

QString DwTool::GetExePath()
{char szPath[_MAX_PATH];::GetModuleFileName(NULL, szPath, _MAX_PATH);return QString::fromLocal8Bit(szPath);  
}

 因为QT默认是Unicode编码,所以上面的代码实际上是下面这样,当然编译不通过了

QString DwTool::GetExePath()
{char szPath[_MAX_PATH];::GetModuleFileNameW(NULL, szPath, _MAX_PATH);return QString::fromLocal8Bit(szPath);  
}

解决方案1:

改成这样,使用ANSI版本windows api

QString DwTool::GetExePath()
{char szPath[_MAX_PATH];::GetModuleFileNameA(NULL, szPath, _MAX_PATH);return QString::fromLocal8Bit(szPath);  
}

或者改成这样,使用Unicode版本的windows api

QString DwTool::GetExePath()
{TCHAR szPath[_MAX_PATH];::GetModuleFileName(NULL, szPath, _MAX_PATH);return QString::fromStdWString(szPath);  
}

3、QString能接受参数为const char*的字符串

但是注意它接受的是utf-8编码的字符串,而不是ANSI编码的

#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)inline QT_ASCII_CAST_WARN QString(const char *ch): d(fromAscii_helper(ch, ch ? int(strlen(ch)) : -1)){}

fromAscii_helper单步进去,就是QString::fromUtf8

如果还是按照MFC习惯,传入ANSI字符串给它,就会导致中文乱码

4、QString内部存储成UTF-8,若需要其它编码,都需要转换,常用的转换函数有

QString转ANSI         

strServer.toLocal8Bit().data()

QString转UTF-8

strDateTime.toUtf8().data()

5、QString的trimmed函数和CString的Trim函数是不同的

QString的trimmed不会影响调用者,它是返回一个去除了空格符的新字符串

而CString的Trim是影响调用者

 6、COleDateTime精度是秒,而QDateTime精度为毫秒

并且,Ado编程,设置时间值也会截断毫秒,但是看MSDN文档说是COledDateTime支持毫秒

我目前找不到办法,有找到的CSDN水友私信我,谢谢

7、多字节CString的GetLength和 QString的size函数

CString strA = "中国伟大复兴123abc"

strA.GetLength()为18   字节数

QString str = "中国伟大复兴123abc"

str.size()为12  字符数

而windows一些api需要传入的是字节数,一定要注意!!!!!!!!!!!

如果用QString想获取字节数,需要先转为QByteArray,再调用size()去获取字节数