2014-09-02 57 views
0

我正在處理一個應用程序CutyCapt,它使用QtWebkit將網頁轉換爲PDF。我們以編程方式驅動它將電子郵件導出爲PDF。在CutyCapt中重寫字體位置

爲了讓我們的測試套件更加健全,在多個平臺上生成儘可能一致的輸出,我試圖確保所有正在進行類似打印的操作都可以訪問所有需要的字體。因此,在所有測試文件旁邊都會檢查一個字體目錄。

到目前爲止PDF導出的所有其他實現都是純Java,並且我們基本上已經採用了一種方式來爲每個導出器指定一個額外字體目錄。但我無法弄清楚如何爲CutyCapt做同樣的事情。

挖掘Qt文檔,我找不到任何關於此事的文字。論壇和門票上的各種帖子導致發現QT_QWS_FONTDIRQT_QPA_FONTDIR,但設置這些似乎並未改變行爲。

有沒有辦法做到這一點?

回答

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

因此,無論您在程序中設置字體「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()); 
    } 
} 
+0

嗯,所以我必須分叉它,並添加自定義目錄中的所有字體。我想我會在「最後的手段」下提交此文件,因爲它看起來好像會起作用。 – Trejkaz 2014-09-02 05:21:26

+0

您也可以嘗試註冊'QT_QWS_FONTDIR'環境變量(以前我也試過沒有任何運氣的東西),或嘗試使用系統字體文件夾執行系統範圍的東西,該文件夾可以通過以下方式獲得:'QStandardPaths :: writableLocation(QStandardPaths: :FontsLocation)'。但我並不真的喜歡這個,我真的不認爲這會是一個簡單的解決方案。我遇到了和你一樣的問題,我仍然認爲使用'QFontDatabase'管理應用程序字體是可取的。 – mhcuervo 2014-09-02 12:49:30