如何在一个类中拥有多个FontLoader对象?

Mus*_*sis 6 qt qml

我正在编写一个应用程序,客户端已提供自定义字体.字体有四个独立的otf文件,一个用于常规,粗体,斜体和粗体.如果我想在我的班级中只使用这四种字体中的一种,我就FontLoader这样创建:

FontLoader { id: clientFontRegular; source: "qrc:/client/fonts/Font-Regular.otf" }
Run Code Online (Sandbox Code Playgroud)

然后我可以用它来对我的页面进行任何控制,如下所示:

font.family: clientFontRegular.name
Run Code Online (Sandbox Code Playgroud)

我的问题是我的页面上有多个控件,我想使用常规的一些,粗体的一些,斜体的其他一些等.为此,我还FontLoader为其他字体添加了对象,如下所示:

FontLoader { id: clientFontBold; source: "qrc:/client/fonts/Font-Bold.otf" }
FontLoader { id: clientFontItalic; source: "qrc:/client/fonts/Font-Italic.otf" }
FontLoader { id: clientFontBoldItalic; source: "qrc:/client/fonts/Font-BoldItalic.otf" }
Run Code Online (Sandbox Code Playgroud)

但这不能正常工作.所有四个id(clientFontRegular,clientFontBold,clientFontItalic和clientFontBoldItalic)都可以在页面的任何位置使用(即不会崩溃或最终使用系统字体),但无论粗体字体是什么,都使用字体.

我知道我的所有四个otf文件都是有效的,因为如果我注释掉除一个文件的FontLoader以外的所有文件并且只使用那个文件,则自定义字体会正确呈现.尝试在一个类中定义多个FontLoader似乎有一个问题(我在网上看到的FontLoader样本都没有使用多个自定义字体).

有人知道怎么做吗?

qCr*_*ing 6

我也在同样的问题上苦苦思索,并想知道为什么在文档中没有任何关于它的内容.这就是我的工作方式:

首先,我定义了一个自定义Text元素(例如Label.qml),其中一个FontLoader元素用于每种字体样式,如下所示:

import QtQuick 2.5

Text {
    FontLoader  { id: loader; source: "fonts/Blogger_Sans.otf"; }
    FontLoader  { source: "fonts/Blogger_Sans-Italic.otf"; }
    FontLoader  { source: "fonts/Blogger_Sans-Light.otf"; }
    FontLoader  { source: "fonts/Blogger_Sans-Medium.otf"; }
    FontLoader  { source: "fonts/Blogger_Sans-Bold.otf"; }
    FontLoader  { source: "fonts/Blogger_Sans-Light_Italic.otf"; }
    FontLoader  { source: "fonts/Blogger_Sans-Medium_Italic.otf"; }
    FontLoader  { source: "fonts/Blogger_Sans-Bold_Italic.otf"; }

    font.family: loader.name;
}
Run Code Online (Sandbox Code Playgroud)

"技巧"是不动态重新分配Text元素的font.family属性.这已足以控制字体样式:

Column {
    anchors.centerIn: parent;

    MyLib.Label {
        text: "Blogger_Sans"
    }

    MyLib.Label {
        text: "Blogger_Sans-Italic"
        font.italic: true;
    }

    MyLib.Label {
        text: "Blogger_Sans-Light"
        font.weight: Font.Light;
    }

    MyLib.Label {
        text: "Blogger_Sans-Medium"
        font.weight: Font.Medium;
    }

    MyLib.Label {
        text: "Blogger_Sans-Bold"
        font.weight: Font.Bold;
    }

    MyLib.Label {
        text: "Blogger_Sans-Light_Italic"
        font.weight: Font.Light;
        font.italic: true;
    }

    MyLib.Label {
        text: "Blogger_Sans-Medium_Italic"
        font.weight: Font.Medium;
        font.italic: true;
    }

    MyLib.Label {
        text: "Blogger_Sans-Bold_Italic"
        font.weight: Font.Bold;
        font.italic: true;
    }
}
Run Code Online (Sandbox Code Playgroud)

我只是假设,但看起来一旦加载了字体(就像在这种情况下是匿名FontLoader的),它们会被记忆并在使用可用的字体属性指定它们时自动可用.但这只是猜测.

编辑

正如peppe的评论中指出的那样,也可以使用QFontDatabase :: addApplicationFont直接在C++中加载自定义字体:

QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans.otf");
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Bold_Italic.otf");
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Medium_Italic.otf");
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Light_Italic.otf");
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Italic.otf");
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Bold.otf");
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Medium.otf");
QFontDatabase::addApplicationFont(resDir + "fonts/Blogger_Sans-Light.otf");
Run Code Online (Sandbox Code Playgroud)

现在QML中提供了字体和相关样式:

Text {
    font.family: "Blogger Sans" // note the use of the font family name
    text: "MyText"
    font.bold: true
    font.italic: true
}
Run Code Online (Sandbox Code Playgroud)

C++方法看起来更干净,并且允许您在不使用文件路径的情况下指定字体,这是另一个很大的优势.

  • 如果您按名称引用字体,您是否也可以使用QFontDatabase在C++中注册TTF? (6认同)
  • @MusiGenesis:我刚刚更新了答案,以涵盖QFontDatabase方法! (3认同)