有时,当我们静态编译Qt后,运行生成的可执行文件会发现无法显示中文。解决该问题的终极解决办法是什么?要想知道这个答案,首先需要知道为什么中文不显示,其根本原因只有一种可能,满足下面两个条件触发:
Qt的的文字渲染不是程序自带的。
系统没有中文字体或是Qt无法调用系统字体。
当知道原因后,可以提出两个解决方案如下:
给系统安装中文字体且启动qt的-fontconfig参数,也就是其中Qt调用系统字体的组件。
让Qt不依赖系统字体,自己就能渲染页面。
网上大部分的教程是教大家用第1种方法,该方法的好处是简单,不会额外可执行文件的体积,但是缺点也很明显,无法在一些没有安装中文字体的操作系统上正确显示。
对于大多数环境来说,这不是问题,因为现在的大部分操作系统默认安装了中文字体。但是既然是终极方法,小沃肯定会教大家第2中方法,因为第2种方法解决这个问题更加的彻底。
首先,我们需要下载一个字体,小沃选择的是google推出的免费开源中文字体noto,下载链接为传送门。
下载下来后,选择其中一个otf文件,并将其放在qt工程中。
然后通过qtcreate将otf文件添加到工程的资源文件中去。
当添加到资源后,就能通过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。