Qt 设置全局默认控件样式与字体

需求如下:

  • 当目标机器未安装对应字体时, 程序中的文字依旧保持原样展示
  • 当未指定控件样式时, 使用配置文件中的样式设置
  • 适用于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"	// 指定到项目下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可以隐式引用字体, 对应到字体名称, 如:
  • 在这里插入图片描述

  • 因此, 直接在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字体:
  • 在这里插入图片描述
  • 启动应用程序:
  • 在这里插入图片描述
  • 可以看到, 字体的默认样式已替换为qtquickcontrols2.conf中的指定字体, 且字体存在于.exe程序中作为二进制资源一同发布, 如更改qtquickcontrols2.conf字体后, 发布仅需替换.exe程序即可
  • 值得关注的是, 字体文件并不存在于本地文件夹中:
  • 在这里插入图片描述

其他

  • 关于DirectoryFontLoader.qml文件, 它来自于使用QtCreator创建的.qmlproject项目, 该文件存在于项目\import\项目名称中, 仅需简单修改即可复制使用
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值