QML FontLoader.name 混乱
QML FontLoader.name confusion
我从 Google Fonts 下载了两个 .ttf 文件到我的项目文件夹中:
- 蒙特塞拉特-ExtraLight.ttf
- 蒙特塞拉特-Black.ttf
我正确设置了 .qrc 文件以包含它们。
假设我有下一个 .qml 文件:
import QtQuick 2.7
import QtQuick.Layouts 1.2
import QtQuick.Controls.Universal 2.0
Rectangle{
id: rectangle
height: 500
width: 700
Column{
FontLoader { id: myCustomFont1; source: "../Fonts/Montserrat/Montserrat-ExtraLight.ttf" }
FontLoader { id: myCustomFont2; source: "../Fonts/Montserrat/Montserrat-Black.ttf" }
Text{
...
text: "Qt for python"
font.family: myCustomFont1.name
...
}
Text{
...
text: "Qt for c++"
font.family: myCustomFont2.name
...
}
}
}
问题是 myCustomFont1.name
和 myCustomFont2.name
是相同的,即“Montserrat”,我没有任何解决方案来区分它们。
因此,即使我指定了正确的 FontLoader-s id-s,第二个文本也会与第一个文本具有相同的 font.family。
有可能以某种方式解决这个问题吗?
这不是一个理想的解决方案,而是一个应该可行的解决方法。有一个名为 FontForge 的开源字体编辑器,您可以使用它来更改 Qt 读取的名称。打开有问题的字体文件,然后打开菜单 Element->Font Info
。这将打开一个对话框,左侧有多个选项卡。第一个选项卡应该是 PS Names
。这应该列出几个字段,包括 Fontname
和 Family Name
。您应该能够将它们编辑为您想要的任何内容。然后关闭该对话框并使用 File->Generate Fonts
重新生成 .ttf 文件。
这令人费解,也是令人沮丧的常见原因。事实证明 name
属性 实际上指定了 family
,如您所见,这些字体文件是相同的。
他们的区别实际上是styleName
。
尝试在字体查看器(如“Font Book”或“FontForge”)中打开字体文件以获得准确的 styleName
- 您需要使用字符串指定它。
然后指定额外的属性:
Text{
...
text: "Qt for python"
font.family: myCustomFont1.name //or myCustomFont2.name, it doesn't matter.
font.styleName: "Extra Light"
...
}
Text{
...
text: "Qt for c++"
font.family: myCustomFont2.name
font.styleName: "Black"
...
}
我发现 styleName
比 weight
或 style
或 bold
的组合更容易预测。这样你就可以使用遵循规范命名约定的字体,而不是修改它们的姓氏来适应 QML。
我从 Google Fonts 下载了两个 .ttf 文件到我的项目文件夹中:
- 蒙特塞拉特-ExtraLight.ttf
- 蒙特塞拉特-Black.ttf
我正确设置了 .qrc 文件以包含它们。
假设我有下一个 .qml 文件:
import QtQuick 2.7
import QtQuick.Layouts 1.2
import QtQuick.Controls.Universal 2.0
Rectangle{
id: rectangle
height: 500
width: 700
Column{
FontLoader { id: myCustomFont1; source: "../Fonts/Montserrat/Montserrat-ExtraLight.ttf" }
FontLoader { id: myCustomFont2; source: "../Fonts/Montserrat/Montserrat-Black.ttf" }
Text{
...
text: "Qt for python"
font.family: myCustomFont1.name
...
}
Text{
...
text: "Qt for c++"
font.family: myCustomFont2.name
...
}
}
}
问题是 myCustomFont1.name
和 myCustomFont2.name
是相同的,即“Montserrat”,我没有任何解决方案来区分它们。
因此,即使我指定了正确的 FontLoader-s id-s,第二个文本也会与第一个文本具有相同的 font.family。
有可能以某种方式解决这个问题吗?
这不是一个理想的解决方案,而是一个应该可行的解决方法。有一个名为 FontForge 的开源字体编辑器,您可以使用它来更改 Qt 读取的名称。打开有问题的字体文件,然后打开菜单 Element->Font Info
。这将打开一个对话框,左侧有多个选项卡。第一个选项卡应该是 PS Names
。这应该列出几个字段,包括 Fontname
和 Family Name
。您应该能够将它们编辑为您想要的任何内容。然后关闭该对话框并使用 File->Generate Fonts
重新生成 .ttf 文件。
这令人费解,也是令人沮丧的常见原因。事实证明 name
属性 实际上指定了 family
,如您所见,这些字体文件是相同的。
他们的区别实际上是styleName
。
尝试在字体查看器(如“Font Book”或“FontForge”)中打开字体文件以获得准确的 styleName
- 您需要使用字符串指定它。
然后指定额外的属性:
Text{
...
text: "Qt for python"
font.family: myCustomFont1.name //or myCustomFont2.name, it doesn't matter.
font.styleName: "Extra Light"
...
}
Text{
...
text: "Qt for c++"
font.family: myCustomFont2.name
font.styleName: "Black"
...
}
我发现 styleName
比 weight
或 style
或 bold
的组合更容易预测。这样你就可以使用遵循规范命名约定的字体,而不是修改它们的姓氏来适应 QML。