我正在使用一个应用程序CutyCapt,它只是使用QtWebkit将网页转换为PDF。我们以编程方式驱动它以将电子邮件导出为PDF。
作为尝试让我们的测试套件保持理智,在多个平台上生成尽可能一致的输出的一部分,我正在努力确保所有进行类似打印操作的操作都可以访问所有必需的字体。因此,在所有测试文件旁边都会检查字体目录。
到目前为止,PDF导出的所有其他实现都是纯Java,我们基本上已经过多种方式来为每个导出器指定其他字体的目录。但我无法弄清楚如何为CutyCapt做同样的事情。
通过Qt文档,我找不到任何关于此事的消息。论坛和门票上的各种帖子都会发现QT_QWS_FONTDIR
和QT_QPA_FONTDIR
,但设置这些帖子似乎不会改变行为。
有什么办法吗?
答案 0 :(得分:3)
为了管理Qt应用程序中的字体,您可以使用QFontDatabase
,它提供有关底层窗口系统中可用字体的信息。
该类有几个静态成员,允许您以编程方式将字体添加到应用程序中。您甚至可以将字体嵌入为资源,但仍然可以加载它们。
我将发布一个真实世界的例子。假设您下载了一个名为" Helvetica Neue"并且您希望将其提供给您的应用程序。嵌入式方法如下所示。
1 - 将所有.ttf文件添加为资源。
2 - 为每个.ttf文件调用addApplicationFont()
。
QFontDatabase fontDB;
fontDB.addApplicationFont(":/fonts/Helvetica Neue/Helvetica Neue CE 35 Thin.ttf");
fontDB.addApplicationFont(":/fonts/Helvetica Neue/Helvetica Neue CE 36 Thin Italic.ttf");
fontDB.addApplicationFont(":/fonts/Helvetica Neue/Helvetica Neue CE 55 Roman.ttf");
fontDB.addApplicationFont(":/fonts/Helvetica Neue/Helvetica Neue CE 56 Italic.ttf");
fontDB.addApplicationFont(":/fonts/Helvetica Neue/Helvetica Neue CE 75 Bold.ttf");
fontDB.addApplicationFont(":/fonts/Helvetica Neue/Helvetica Neue CE 56 Bold Italic.ttf");
3 - 你完成了。您现在可以执行以下操作来检查" Helvetica Neue"字体系列就在那里。
for (int i = 0; i < fontDB.families().size(); ++i)
qDebug() << fontDB.families().at(i);
所以,无论你在哪里设置字体&#34; Helvetica Neue&#34;在你的程序中,它将被找到。
这很明显,但如果您不希望逐个将字体加载到应用程序中,那么它很容易管理。例如,以下(和天真的)代码段将尝试加载特定文件夹中的所有文件,就像它们是字体一样。
QDir myFontsDirectory("myfonts");
if (!myFontsDirectory.exists())
{
qWarning("Cannot find the directory");
}
else
{
QFileInfoList list = myFontsDirectory.entryInfoList();
for (int i = 0; i < list.size(); ++i)
{
QFileInfo fileInfo = list.at(i);
fontDB.addApplicationFont(fileInfo.filePath());
}
}