QT一些容易犯错的点
概述
这些点都是建立在qt5.0之后的,而且以默认中文操作系统为准
关于文字编码
这里说的文字编码主要指的,当你要显示一段文字时,否则没必要管编码。
比如在qt里书写如下代码:
const char *cp = "中国";
那么这个cp里面是什么内容呢,如果调用ui->label->setText(cp),又是否能正确显示呢?
我们只说结论,细节参考 其它文章,网上不少
-
cp里面是什么内容呢?
首先cp是一段buffer,运行时里面是什么内容要根据运行时的编码来决定,关于各种编码定义是个新课题,不适合笔记。
当运行时编码是utf-8时,cp是6个字节的buffer(不含\0)
当运行时编码是GBK时,cp是4个字节的buffer(不含\0) -
cp又是否能正确显示呢?
在Qt中,唯一能让人迷惑的就是类似这样的代码乱码 (windows下 使用msvc kit)
setText(tr(“中国”))
此处出乱码是有个隐形的东西,msvc kit在中文系统会默认指定前文提到的运行时编码为GBK, 这就导致cp也就是tr括弧内的"中国“为 4字节的gbk编码,而不是tr预期的6字节utf-8编码,然后tr按照utf8去解释这个gbk的buffer,那自然是乱码。
如何克服呢, 在.pro加个编译选项即可
QMAKE_CXXFLAGS += -execution-charset:utf-8
rebuild 后发现乱码解决了
这里要提一个点 qt5.0后 tr宏不在可以指定codec了,也就是说它会固定认为 tr扩起来的buffer是utf8编码,如果不是,又没翻译文件的话,会出乱码,上文中国出乱码就是因为没改之前tr里面不是utf8的编码
你查看tr源码就会发现,它先去翻译文件找这个字符串,如果找不到,直接调用QSring::fromUtf8(cp), 那说道这,其实都真像(●—●)了。