我正在编写客户端已为其提供自定义字体的应用程序。该字体以四个单独的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/