Qt解决中文不显示问题的终极解决办法

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

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

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

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

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

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

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

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

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

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

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

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

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

#include "mainwindow.h"

#include

// 下方两个头文件是添加的

#include

#include


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。


你可能感兴趣的:(Qt解决中文不显示问题的终极解决办法)