Переопределение расположения шрифта в CutyCapt
Я работаю с приложением CutyCapt, которое просто конвертирует веб-страницы в PDF с помощью QtWebkit. Мы ведем это программно, чтобы экспортировать электронные письма в PDF.
В рамках попытки сделать наш набор тестов разумным, генерируя как можно более согласованные выходные данные на нескольких платформах, я стараюсь обеспечить, чтобы все, что выполняет операции, подобные печати, имело доступ ко всем необходимым шрифтам. Таким образом, каталог шрифтов отмечен рядом со всеми тестовыми файлами.
До сих пор все другие реализации экспорта в PDF - это чистая Java, и мы по существу включили способы указать каталог дополнительных шрифтов для каждого экспортера. Но я не могу понять, как сделать то же самое для CutyCapt.
Копаясь в документах Qt, я не могу найти ни слова по этому вопросу. Различные посты на форумах и билеты привели к открытию QT_QWS_FONTDIR
а также QT_QPA_FONTDIR
но установка этих параметров не влияет на поведение.
Есть ли способ сделать это?
1 ответ
Для управления шрифтами в приложении 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" в своей программе, он будет найден.
Это довольно очевидно, но если вы не хотите загружать шрифты в приложение по одному, управлять им довольно просто. Например, следующий (и наивный) фрагмент кода попытается загрузить все файлы в определенной папке, как если бы они были шрифтами.
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());
}
}