QML FontLoader.name 混乱

QML FontLoader.name confusion

我从 Google Fonts 下载了两个 .ttf 文件到我的项目文件夹中:

  1. 蒙特塞拉特-ExtraLight.ttf
  2. 蒙特塞拉特-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.namemyCustomFont2.name 是相同的,即“Montserrat”,我没有任何解决方案来区分它们。 因此,即使我指定了正确的 FontLoader-s id-s,第二个文本也会与第一个文本具有相同的 font.family。 有可能以某种方式解决这个问题吗?

这不是一个理想的解决方案,而是一个应该可行的解决方法。有一个名为 FontForge 的开源字体编辑器,您可以使用它来更改 Qt 读取的名称。打开有问题的字体文件,然后打开菜单 Element->Font Info。这将打开一个对话框,左侧有多个选项卡。第一个选项卡应该是 PS Names。这应该列出几个字段,包括 FontnameFamily 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"
              ...
          }

我发现 styleNameweightstylebold 的组合更容易预测。这样你就可以使用遵循规范命名约定的字体,而不是修改它们的姓氏来适应 QML。