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-8
    QMAKE_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-16,若需要其它编码,都需要转换,常用的转换函数有

QString转ANSI         

strServer.toLocal8Bit().data()

QString转UTF-8

strDateTime.toUtf8().data()

5、QString的toLocal8Bit和fromLocal8Bit的编码依赖于下面的函数设定,默认是ANSI编码

QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);

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

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

而CString的Trim是影响调用者

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

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

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

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

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

strA.GetLength()为18   字节数

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

str.size()为12  字符数

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

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

 

 9、QT使用第三方xml库的时候需要注意,接收的函数参数比如路径名这些需要是ANSI编码,但是xml传入的内容可以是ANSI或者UTF-8

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值