QML:一种跨平台的等宽/普通字体方式

4
有没有一种平台无关的方法,在Qml中在“normal”和“monospace”之间切换font.family
Label {
   font.family: "Monospace"
}

目前我需要分别设置每个平台的字体。将字体与应用程序一起发布也不是一个选项,因为文本很可能是系统语言(例如用户界面是英语,但文本可能是波斯语)。

敬礼,


平台不必提供等宽字体。 - dtech
1个回答

3

看起来这个问题的被接受答案是有效的,所以你可以将那个字体作为上下文属性暴露给QML:

main.cpp:

#include <QApplication>
#include <QFontDatabase>
#include <QQmlApplicationEngine>
#include <QQmlContext>

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

    QQmlApplicationEngine engine;
    const QFont fixedFont = QFontDatabase::systemFont(QFontDatabase::FixedFont);
    engine.rootContext()->setContextProperty("fixedFont", fixedFont);
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));

    return app.exec();
}

main.qml:

import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 2.0

Window {
    width: 400
    height: 400
    visible: true

    Switch {
        id: monospaceSwitch
    }

    Text {
        text: "Hello World"
        font: monospaceSwitch.checked ? fixedFont : Qt.application.font
        anchors.centerIn: parent
    }
}

这里假设系统中存在等宽字体。

QFontDatabase::systemFont(QFontDatabase::FixedFont) 不会返回固定字体(例如,当“qtquickcontrols2.conf”文件设置为Style=Universal时,它会返回“Segoe UI”,而在使用Material Design时则会返回另一种非固定字体)。但这可能是Qt的一个bug。 - Hyndrix
顺便提一下:系统上存在一种单调字体(“Courier New”)。 - Hyndrix
听起来像个bug? - Mitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接