0

我正在使用一个应用程序 CutyCapt,它只是使用 QtWebkit 将网页转换为 PDF。我们正在以编程方式将电子邮件导出为 PDF。

作为尝试使我们的测试套件健全的一部分,在多个平台上生成尽可能一致的输出,我试图确保所有进行类似打印操作的东西都可以访问所有必需的字体。因此,在所有测试文件旁边签入了一个字体目录。

到目前为止,PDF 导出的所有其他实现都是纯 Java 的,我们基本上采用了为每个导出器指定附加字体目录的方法。但我不知道如何为 CutyCapt 做同样的事情。

挖掘 Qt 文档,我找不到任何关于此事的消息。论坛和门票上的各种帖子导致发现QT_QWS_FONTDIRQT_QPA_FONTDIR但设置这些似乎并没有改变行为。

有什么办法吗?

4

1 回答 1

3

为了在 Qt 应用程序中管理字体,您可以使用QFontDatabase提供有关底层窗口系统中可用字体的信息的 a。该类有几个静态成员,除其他外,它们允许您以编程方式将字体添加到您的应用程序。您甚至可以将字体作为资源嵌入,并且仍然可以加载它们。

我将发布一个真实世界的示例。假设您下载了一个名为“Helvetica Neue”的字体系列,并且希望将其提供给您的应用程序。嵌入式方法如下所示。

1 - 将所有 .ttf 文件添加为资源。

2 - 调用addApplicationFont()每个 .ttf 文件。

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);

因此,无论您在程序中设置字体“Helvetica Neue”的何处,都会找到它。

这很明显,但是如果您不想将字体一个一个地加载到您的应用程序中,那么管理起来很容易。例如,以下(和幼稚的)代码片段将尝试加载特定文件夹中的所有文件,就好像它们是字体一样。

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());
    }
}
于 2014-09-02T04:48:43.910 回答