Qt在Linux下中文变方块的问题

最近遇到一个问题:一个Qt程序在Windows上正常运行,在Linux下编译运行后汉字就全变成方块了,成了名副其实的“方块字”。

我一开始考虑是字符编码问题,调用QChar::unicode检查中文字符的编码,发现没有问题。

如果不是编码问题,那就需要考虑是字体问题了。然后就安装了文泉驿字体,然后将控件字体设置为文泉驿,发现还是没有用。

调用QFontDatabase::families检查所有可用字体,发现只有三四个可用的字体,而且都是英文字体。

那么问题来了,同样是Qt程序,为什么我使用的IDE——Qt Creator能够找到文泉驿字体,而我的程序不能?

实际上是因为库的问题,Qt Creator我使用的是二进制安装版,不需要编译,它依赖的是随主程序安装的Qt库。而我的程序依赖了我自己编译安装的Qt库。由于这两个版本的库编译选项不同,导致Qt程序自动查找到的可用字体不同。

那么,Qt在Linux下如何查找可用字体呢?

有两种情况:

  1. 操作系统安装了fontconfig库和freetype库,且Qt编译选项依赖了这两个库

这种情况下Qt使用了platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp文件中的void QFontconfigDatabase::populateFontDatabase()函数,依赖fontconfig库来查找字体文件,所以/usr/share/fonts下的字体都能找得到,Qt程序也就可以正常使用这些字体了。

  1. 操作系统没有安装fontconfig库和freetype库,或Qt编译选项没有依赖这两个库

这种情况下Qt会使用gui/text/qplatformfontdatabase.cpp文件中的void QPlatformFontDatabase::populateFontDatabase()函数来自行查找字体。如果你设置了QT_QPA_FONTDIR环境变量,那么Qt会在环境变量这个路径中查找可用字体;如果未设置环境变量,则会在Qt安装目录下的lib/fonts目录下查找可用字体。

所以如果Qt在Linux下出现了中文变方块的问题的话,且原因和本文中描述相同的话,有以下几种可行的解决方式:

  1. 安装fontconfigfreetype库,重新编译安装Qt。此种方法最为一劳永逸。
  2. 将你想用的字体文件复制到Qt安装目录下的lib/fonts目录。
  3. 设置QT_QPA_FONTDIR环境变量到你想用的字体文件目录。
  4. 手动读取加载字体文件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章