您好,欢迎访问沃航(武汉)科技有限公司官方网站
Qt解决中文不显示问题的终极解决办法
2022-01-06 23:52:40

有时,当我们静态编译Qt后,运行生成的可执行文件会发现无法显示中文。解决该问题的终极解决办法是什么?要想知道这个答案,首先需要知道为什么中文不显示,其根本原因只有一种可能,满足下面两个条件触发:

  1. Qt的的文字渲染不是程序自带的。

  2. 系统没有中文字体或是Qt无法调用系统字体。

当知道原因后,可以提出两个解决方案如下:

  1. 给系统安装中文字体且启动qt的-fontconfig参数,也就是其中Qt调用系统字体的组件。

  2. 让Qt不依赖系统字体,自己就能渲染页面。

网上大部分的教程是教大家用第1种方法,该方法的好处是简单,不会额外可执行文件的体积,但是缺点也很明显,无法在一些没有安装中文字体的操作系统上正确显示。

对于大多数环境来说,这不是问题,因为现在的大部分操作系统默认安装了中文字体。但是既然是终极方法,小沃肯定会教大家第2中方法,因为第2种方法解决这个问题更加的彻底。

首先,我们需要下载一个字体,小沃选择的是google推出的免费开源中文字体noto,下载链接为传送门

下载下来后,选择其中一个otf文件,并将其放在qt工程中。

然后通过qtcreate将otf文件添加到工程的资源文件中去。

465.jpg789.jpg101.jpg

当添加到资源后,就能通过Qt访问文件的sdk进行调用了,调用前路径需要添加冒号,也就是说如果你添加了一个fonts.otf文件,前缀设置的是"/",需要通过":/fonts.otf"来访问。

然后打开Qt工程是main.cpp文件,在main函数中添加如下代码

#include "mainwindow.h"
#include <QApplication>
// 下方两个头文件是添加的
#include <QFontDatabase>
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // 下方代码为新增的,功能是从资源文件中加载字体,并且设置默认字体为新加载的字体,字体大小默认为13,解析编码默认为utf-8
    int fontId = QFontDatabase::addApplicationFont(":/fonts.otf");
    QString fontname = QFontDatabase::applicationFontFamilies (fontId).at(0);
    QFont font;
    font.setFamily(fontname);
    font.setPixelSize(13);
    font.setWeight(QFont::Normal);
    font.setItalic(false);
    a.setFont(font);
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);

    MainWindow w;
    w.show();

    return a.exec();
}

这样一来,编译的时候字体文件就会被编译到Qt中去,不再依赖系统字体,能更好的做到跨平台运行。但是缺点明显,那就是文件体积变得更大了,小沃选择的字体体积是10M,因此编译出来的可执行文件体积又增加了10M。


文章作者:沃航科技

联系我们
地址:
武汉市洪山区蓝晶国际7栋903
QQ:
932773931
电话:
027-59761089-806
手机:
13397158231
邮箱:
jevian_ma@worldflying.cn
×
物联网组态平台
试用账号:123456
试用密码:123456
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn
×
积木编程平台
试用方式:试用手机号码注册即可使用
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn