需求如下:
- 当目标机器未安装对应字体时, 程序中的文字依旧保持原样展示
- 当未指定控件样式时, 使用配置文件中的样式设置
- 适用于CMake项目
- 使用环境
Qt Creator 10.0.1
Qt 6.5.0
Windows 11 Pro KB5026447
第一部分, 实现自动载入字体:
-
步骤一, 创建字体载入类qml, 文件名如: DirectoryFontLoader.qml
import QtQuick 6.2
import Qt.labs.folderlistmodel 6.2
QtObject {
id: loader
property url fontDirectory: Qt.resolvedUrl(relativeFontDirectory)
property string relativeFontDirectory: "fonts"
function loadFont(url) {
var fontLoader = Qt.createQmlObject('import QtQuick 2.15; FontLoader { source: "' + url + '"; }',
loader,
"dynamicFontLoader");
}
property FolderListModel folderModel: FolderListModel {
id: folderModel
folder: loader.fontDirectory
nameFilters: [ "*.ttf", "*.otf" ]
showDirs: false
onStatusChanged: {
if (folderModel.status == FolderListModel.Ready) {
var i
for (i = 0; i < count; i++) {
loadFont(folderModel.get(i, "fileURL"))
}
}
}
}
}
-
步骤二, 在程序启动时, 或主窗口, 引用字体载入类, 使其初始化,如Main.qml
import QtQuick
import QtQuick.Controls
ApplicationWindow {
id: mainWindow
width: 1280
height: 720
visible: true
title: qsTr("Hello World")
DirectoryFontLoader {
id: fontLoader
}
}
-
仔细观察, 在DirectoryFontLoader.qml
中, 动态创建了FontLoader
对象, 因此, 在稍后的qtquickcontrols2.conf
中, fontFamily
可以隐式引用字体, 对应到字体名称, 如:
-
![在这里插入图片描述](https://img-blog.csdnimg.cn/5e36c1c97d2d42aa9649c109d7e3404c.png)
-
因此, 直接在qtquickcontrols2.conf
对应到Font name, 即可设置全局默认字体, 关于qtquickcontrols2.conf
文件, 请向下阅读
第二部分, 编写全局默认样式配置qtquickcontrols2.conf
文件
[Controls]
Style=Material
[Universal]
Theme=System
Accent=#0C7BCC
[Material]
Accent=#0C7BCC
Primary=#0C7BCC
[Material\Font]
;字体名称, 与字体文件中的Font name对应
Family=JetBrains Mono
PixelSize=12
qt_add_resources(appNewRawQuick "configuration"
PREFIX "/"
FILES
qtquickcontrols2.conf
)
- 此处,
appNewRawQuick
为项目名称, 根据使用情况修改即可
至此, 所有步骤已完成, 接下来进行发布测试:
Windows Server 2019 DataCenter 1809
- 可以看到, 目标机器上未安装
JetBrains Mono
字体: ![在这里插入图片描述](https://img-blog.csdnimg.cn/7cb9ecb684cf41ac9750e9b50c9fbcf9.png)
- 启动应用程序:
![在这里插入图片描述](https://img-blog.csdnimg.cn/e9be17cdfeb342c6994beca10af0c85d.png)
- 可以看到, 字体的默认样式已替换为
qtquickcontrols2.conf
中的指定字体, 且字体存在于.exe
程序中作为二进制资源一同发布, 如更改qtquickcontrols2.conf
字体后, 发布仅需替换.exe
程序即可 - 值得关注的是, 字体文件并不存在于本地文件夹中:
![在这里插入图片描述](https://img-blog.csdnimg.cn/fe48e9bd8a054432b040b0d8e8536dc4.png)
其他
-
关于DirectoryFontLoader.qml
文件, 它来自于使用QtCreator创建的.qmlproject
项目, 该文件存在于项目\import\项目名称
中, 仅需简单修改即可复制使用