QT一些容易犯错的点

2023-01-15  本文已影响0人  九风特

概述

这些点都是建立在qt5.0之后的,而且以默认中文操作系统为准

关于文字编码

这里说的文字编码主要指的,当你要显示一段文字时,否则没必要管编码。
比如在qt里书写如下代码:
const char *cp = "中国";
那么这个cp里面是什么内容呢,如果调用ui->label->setText(cp),又是否能正确显示呢?
我们只说结论,细节参考 其它文章,网上不少

  1. cp里面是什么内容呢?
    首先cp是一段buffer,运行时里面是什么内容要根据运行时的编码来决定,关于各种编码定义是个新课题,不适合笔记。
    当运行时编码是utf-8时,cp是6个字节的buffer(不含\0)
    当运行时编码是GBK时,cp是4个字节的buffer(不含\0)

  2. 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), 那说道这,其实都真像(●—●)了。

上一篇下一篇

猜你喜欢

热点阅读