You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Qt 5.4版QML获取解析后字体族的方法(替代Qt5.9的fontInfo.family)

在Qt 5.4中获取解析后的字体族名称

由于Qt 5.4的QML Text 组件并没有提供 fontInfo.family 这样的属性来直接获取解析后的字体族,我们可以通过C++扩展QML的方式来实现相同的效果,核心思路是利用Qt C++模块中的QFont类处理字体解析,再将功能暴露给QML使用。

具体实现步骤:

1. 创建C++辅助类

首先编写一个继承自QObject的工具类,提供方法接收字体名称并返回系统实际解析后的字体族:

#include <QObject>
#include <QFont>

class FontResolver : public QObject
{
    Q_OBJECT
public:
    explicit FontResolver(QObject *parent = nullptr) : QObject(parent) {}

    // 标记为Q_INVOKABLE,允许QML直接调用该方法
    Q_INVOKABLE QString getResolvedFontFamily(const QString &requestedFont) {
        QFont font(requestedFont);
        // resolved()方法返回系统实际选用的字体对象(已完成解析)
        QFont resolvedFont = font.resolved();
        return resolvedFont.family();
    }
};

2. 将类注册到QML引擎

main.cpp中,把这个工具类注册为QML可访问的类型:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "fontresolver.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    // 注册自定义类型到QML的命名空间
    qmlRegisterType<FontResolver>("com.example.fontutils", 1, 0, "FontResolver");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

3. 在QML中调用使用

现在可以在QML里导入命名空间,创建工具类实例并调用方法:

import QtQuick 2.2
import com.example.fontutils 1.0

Rectangle {
    width: 400
    height: 300

    FontResolver {
        id: fontResolver
    }

    Column {
        anchors.centerIn: parent
        spacing: 10

        Text {
            text: "请求字体: 'Helvetica' → 解析后: " + fontResolver.getResolvedFontFamily("Helvetica")
            font.family: "Helvetica"
        }

        Text {
            text: "请求字体: '不存在的字体' → 解析后: " + fontResolver.getResolvedFontFamily("NonExistentFont")
            font.family: "NonExistentFont"
        }
    }
}

原理说明

QFont::resolved()方法会返回经过系统解析的字体对象,它会自动处理「请求字体不存在时使用 fallback 字体」的逻辑,最终返回的family()值就是系统实际渲染文本时使用的字体族名称,和Qt 5.9+中fontInfo.family的效果完全一致。

内容的提问来源于stack exchange,提问作者Kamath

火山引擎 最新活动