我正在编写客户端已为其提供自定义字体的应用程序。该字体以四个单独的otf文件的形式提供,其中一个用于常规,粗体,斜体和粗斜体。如果我只想在类里面使用这四种字体中的一种,则可以这样创建FontLoader:

FontLoader { id: clientFontRegular; source: "qrc:/client/fonts/Font-Regular.otf" }

然后可以将其用于页面上的任何控件,如下所示:
font.family: clientFontRegular.name

我的问题是我的页面上有多个控件,我想对某些字体使用常规,对某些字体使用粗体,对其他字体使用斜体等。为此,我还为其他字体添加了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" }

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

我知道我的otf文件中的全部四个都是有效的,因为如果我注释掉除了FontLoader之外的所有文件,并且仅使用该文件,则自定义字体将正确呈现。尝试在一个类中定义多个FontLoader似乎有问题(我在网上看到的所有FontLoader示例都没有使用一种以上的自定义字体)。

有人知道该怎么做吗?

最佳答案

我也为同样的问题而苦苦挣扎,想知道为什么文档中对此一无所知。这就是我的工作方式:

首先,我定义了一个自定义 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;
}

“技巧”是不动态重新分配 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;
    }
}

我只是假设,但是看起来一旦加载字体(在本例中为匿名 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");

现在,字体和相关样式在QML中可用:
Text {
    font.family: "Blogger Sans" // note the use of the font family name
    text: "MyText"
    font.bold: true
    font.italic: true
}

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

关于qt - 如何在一个类中具有多个FontLoader对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37083386/

10-13 03:43