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




