最近遇到一个问题:一个Qt程序在Windows上正常运行,在Linux下编译运行后汉字就全变成方块了,成了名副其实的“方块字”。
我一开始考虑是字符编码问题,调用QChar::unicode
检查中文字符的编码,发现没有问题。
如果不是编码问题,那就需要考虑是字体问题了。然后就安装了文泉驿字体,然后将控件字体设置为文泉驿,发现还是没有用。
调用QFontDatabase::families
检查所有可用字体,发现只有三四个可用的字体,而且都是英文字体。
那么问题来了,同样是Qt程序,为什么我使用的IDE——Qt Creator能够找到文泉驿字体,而我的程序不能?
实际上是因为库的问题,Qt Creator我使用的是二进制安装版,不需要编译,它依赖的是随主程序安装的Qt库。而我的程序依赖了我自己编译安装的Qt库。由于这两个版本的库编译选项不同,导致Qt程序自动查找到的可用字体不同。
那么,Qt在Linux下如何查找可用字体呢?
有两种情况:
- 操作系统安装了
fontconfig
库和freetype
库,且Qt编译选项依赖了这两个库
这种情况下Qt使用了platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
文件中的void QFontconfigDatabase::populateFontDatabase()
函数,依赖fontconfig
库来查找字体文件,所以/usr/share/fonts
下的字体都能找得到,Qt程序也就可以正常使用这些字体了。
- 操作系统没有安装
fontconfig
库和freetype
库,或Qt编译选项没有依赖这两个库
这种情况下Qt会使用gui/text/qplatformfontdatabase.cpp
文件中的void QPlatformFontDatabase::populateFontDatabase()
函数来自行查找字体。如果你设置了QT_QPA_FONTDIR
环境变量,那么Qt会在环境变量这个路径中查找可用字体;如果未设置环境变量,则会在Qt安装目录下的lib/fonts
目录下查找可用字体。
所以如果Qt在Linux下出现了中文变方块的问题的话,且原因和本文中描述相同的话,有以下几种可行的解决方式:
- 安装
fontconfig
和freetype
库,重新编译安装Qt。此种方法最为一劳永逸。 - 将你想用的字体文件复制到Qt安装目录下的
lib/fonts
目录。 - 设置
QT_QPA_FONTDIR
环境变量到你想用的字体文件目录。 - 手动读取加载字体文件。