Qt QML qtquickcontrols2.conf 使用系統未安裝的自定義字體
- 2020 年 2 月 18 日
- 筆記
現在很多視覺設計最終給出的字體可能並不是所有系統都安裝過的,所以項目中可能需要單獨把字體文件打包進去在程式運行的時候載入。Qt QML 有多種方式載入一個自定義字體,本文將介紹所有我知道的方式,大家根據自己的需要選擇使用任意一種即可。
使用 FontLoader 方式載入並使用
FontLoader 在 QML 文檔中有非常詳細的介紹,載入和使用字體的方式如下:
import QtQuick 2.0 Column { FontLoader { id: fixedFont; name: "Courier" } FontLoader { id: webFont; source: "http://www.mysite.com/myfont.ttf" } Text { text: "Fixed-size font"; font.family: fixedFont.name } Text { text: "Fancy font"; font.family: webFont.name } }
FontLoader 可以載入網路字體、系統中已經安裝的字體和本地文件的字體,當然也可以從資源文件中載入。但是如果你把很大的字體文件放到資源文件中,那麼編譯出來的執行文件體積也會隨之增加,所以不推薦這樣嘗試。
C++ 載入字體 qtquickcontrols2.conf 配置設置全局字體
Qt Quick 提供了一種通過 qtquickcontrols2.conf 設置全局字體的方式,通過 qtquickcontrols2.conf 設置後你不需要像上面示例程式碼中給單獨的控制項設置字體樣式。見此文檔:https://doc.qt.io/qt-5/qtquickcontrols2-configuration.html。使用 qtquickcontrols2.conf 來載入字體前提是你的應用程式已經載入了字體,我們可以通過 C++ 程式碼在運行 QML Engine 前將字體載入好:
// Load font from local file int localFont = QFontDatabase::addApplicationFont(QGuiApplication::applicationDirPath() + "/fonts/PingFang.ttf"); QFontDatabase::applicationFontFamilies(localFont);
這樣你將字體文件放到跟你執行程式相同目錄下的 fonts 文件夾即可。程式運行會先載入字體,隨後 QML 介面彈出發現 qtquickcontrols2.conf 設置了你需要的字體則載入該字體使用。比如我們使用的是 Material 樣式,那麼我們在 Material 樣式下面設置默認字體為我們剛剛載入的 PingFang SC
就可以跑起來了。
[Material] Primary=#337EFF Accent=#337EFF Theme=System Background=#FFFFFF FontFamily=PingFang SC FontPixelSize=14