美文网首页
QT一些容易犯错的点

QT一些容易犯错的点

作者: 九风特 | 来源:发表于2023-01-15 15:49 被阅读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), 那说道这,其实都真像(●—●)了。

    相关文章

      网友评论

          本文标题:QT一些容易犯错的点

          本文链接:https://www.haomeiwen.com/subject/uzdacdtx.html