如何在 Qt for Embedded Linux 中定位和使用字体?

How to locate and use fonts in Qt for Embedded Linux?

这个问题可能与这个问题有关: Where does QT go to look for fonts?

我正在使用 Ubuntu 14.04 和 Qt for Embedded 4.8,我想全局更改我的应用程序的字体,但我只能使用我安装的字体中的一个非常小的子集。

我的应用程序的样式是从我写的 CSS 文件加载的:

QWidget {
   font-family: "DejaVu Sans"; /*or any other font*/
}

问题是 Qt 似乎无法找到我安装的字体。根据文档 Deploying Qt for Embedded Linux Applications,Qt 应用程序在 lib/fonts/ 目录中查找字体,并且专门查找名为 fontdir[=49= 的文件].我不知道这个文件是关于什么的,我也找不到它。我的字体(调试版本)的完整路径是:/usr/local/Trolltech/QtEmbedded-4.8.6-x86-dbg/lib/fonts

我使用可以找到的 QFontDatabase in the Qt 4.8 docu 来打印我所有可用的字体。不幸的是输出是:

DejaVu Sans: Normal (11)
fixed: Normal (7 12)
helvetica: Normal (8 10 12 14 18 24) Italic (8 10 12 14 18 24) Bold (8 10 12 14 18 24) Bold Italic (8 10 12 14 18 24)
japanese: Normal (23)
micro: Normal (4)
unifont: Normal (16)

但是我安装了更多的字体。例如 DejaVu Sans 也存在于 bold 和其他类型中,但只有 "Normal" 被发现。这里只是我的字体文件夹中的一小部分字体(它们也位于用于发布和调试的 Qt 文件夹中):

couri.pfa
cour.pfa
cursor.pfa
dejavu_sans_11_50.qpf2
DejaVuSans-BoldOblique.ttf
DejaVuSans-Bold.ttf
DejaVuSansMono-BoldOblique.ttf
DejaVuSansMono-Bold.ttf
DejaVuSansMono-Oblique.ttf
DejaVuSansMono.ttf
DejaVuSans-Oblique.ttf
DejaVuSans.ttf
DejaVuSerif-BoldOblique.ttf
VeraMono.ttf
VeraSeBd.ttf
VeraSe.ttf
Vera.ttf
  1. 什么是 fontdir 文件,我需要它吗?如何创建它?

  2. 我必须做什么才能让 Qt 找到我安装的所有字体?

  3. 有没有一种方法可以简单地使用我感兴趣的字体的副本并将其放入我的应用程序的子目录中以将其视为图标,这样我就不必弄乱了所有系统位置周围?

编辑: 根据这个 thread 我认为我也不支持 TTF 字体。我查看了我的字体,似乎找到了所有 *.qpf 和 *.qpf2 字体。所以我将尝试将我的 TTF 转换为 QPF。

What is the fontdir file for, do I need it and how do I create it?

仅当应使用 Qt 特定 "light-weight" 格式的 QPF 字体时才需要此文件。 Qt 工具 makeqpf 使用该文件(据我了解)。

What do I have to do so that Qt finds all my installed fonts?

如果 Qt 是使用 -no-freetype 编译的,则无法使用 TTF 字体,因此 QFontDatabase 无法找到这些字体。要启用 TTF 支持,必须在没有此编译配置标志的情况下编译 Qt。我已经重新编译它并且找到了/usr/local/Trolltech/QtEmbedded-4.8.6-x86-dbg/lib/fonts中的所有字体。

Is there a way to simply use a copy of my font of interest and put it into a sub-directory of my application to treat it like an icon so that I don't have to mess around with all the system locations?

是的。可以简单地使用 QFontDatabase::addApplicationFont 对于支持的字体格式应该不会失败。

请注意,我决定重新编译 Qt,因为我不想弄乱 Qt 的 makeqpf 工具,该工具可用于将 TTF 字体转换为 QPF 格式。