gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:50:06 25 4
gpt4 key购买 nike

我正在编写一个应用程序,客户已为其提供了自定义字体。该字体有四个独立的 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 s),它们就会被记住,并在使用可用字体属性指定它们时自动变得可用。但这只是猜测。

编辑

正如 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com