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. 手動讀取加載字體文件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章