0

QtWebkit を使用して Web ページを PDF に変換するアプリケーション CutyCapt を使用しています。プログラムで電子メールを PDF にエクスポートするようにしています。

私たちのテスト スイートを健全なものにし、複数のプラットフォーム間で可能な限り一貫した出力を生成する試みの一環として、印刷のような操作を行うすべてのものが必要なすべてのフォントにアクセスできるようにしています。そのため、すべてのテスト ファイルの次にフォントのディレクトリがチェックインされます。

これまでの PDF エクスポートの他のすべての実装は純粋な Java であり、すべてのエクスポーターに追加フォントのディレクトリを指定する方法を本質的に押し付けてきました。しかし、CutyCapt で同じようなことを行う方法がわかりません。

Qt のドキュメントを調べてみても、この問題に関する言葉は見つかりません。フォーラムやチケットに関するさまざまな投稿の結果、発見されましたQT_QWS_FONTDIRQT_QPA_FONTDIR、これらを設定しても動作は変わらないようです。

それを行う方法はありますか?

4

1 に答える 1

3

Qt アプリケーションでフォントを管理するにQFontDatabaseは、下層のウィンドウ システムで使用可能なフォントに関する情報を提供する を使用できます。このクラスにはいくつかの静的メンバーがあり、特に、アプリケーションにフォントをプログラムで追加することができます。フォントをリソースとして埋め込むこともでき、それらをロードすることもできます。

実際の例を投稿します。「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」を設定した場所ならどこでも見つかります。

これは非常に明白ですが、アプリケーションにフォントを 1 つずつロードしたくない場合は、管理が非常に簡単です。たとえば、次の (そして素朴な) コード スニペットは、特定のフォルダー内のすべてのファイルをフォントであるかのように読み込もうとします。

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 に答える