QML 中的字体拉伸

Font stretching in QML

我们正在将一些较旧的 QT 小部件代码转换为使用 QML,但我找不到 QFont::setStretch() 操作的等效 属性。

QML Font page 仅显示系列、粗体、斜体、下划线、pointSize、pixelSize、粗细、上划线、删除线、大写、字母间距、字间距、字距调整、preferShaping 和 hintingPreference。

此字体选择是在 Text 对象内完成的,符合以下行:

Text {
    font.family: "LiberationSans"
    font.pixelSize: 178
    font.weight: 80
    //font.stretch: 75 - doesn't work, no such property
}

在QML中有没有办法设置拉伸因子。顺便说一句,我们正在使用 Qt 5.6。

不幸的是,这个 属性 没有暴露给 QML,一个可能的解决方案是使用接收 QFont 的助手 class,更改拉伸和 return 新的 QFont。

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QFont>

class FontHelper: public QObject{
    Q_OBJECT
public:
    using QObject::QObject;
    Q_INVOKABLE QFont changeStretchFont(const QFont & font, int factor){
        QFont fn(font);
        fn.setStretch(factor);
        return fn;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    FontHelper helper;
    engine.rootContext()->setContextProperty("fontHelper", &helper);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

#include "main.moc"

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Text {
        id: txt
        font.family: "Helvetica"
        font.pointSize: 13
        font.bold: true
        text: "hello World"
        Component.onCompleted: txt.font = fontHelper.changeStretchFont(txt.font, 200)
    }
}

试试这个:

Text {
    font.family: "LiberationSans"
    font.pixelSize: 178
    font.weight: 80
    transform: Scale { xScale: 0.75}
    //font.stretch: 75 - doesn't work, no such property
}