Qt - Пользовательский шрифт в QTextDocument
Я пытаюсь создать файл PDF из QTextDocument
, который работает просто отлично. Проблема возникает, когда я хочу использовать собственный шрифт только для определенного <p></p>
объект. Я пытался использовать стандартные средства QFontDatabase::addApplicationFont()
который успешно загружает шрифт в приложение, но по какой-то причине записывает все QString
переменные, которые добавляются к messageBody
в этом шрифте вместо того, что указано QTextFocument.setDefaultFont()
или даже вручную через style={font-family:}
,
Я делаю это неправильно, или что-то упускаю из виду, или это какая-то ошибка?
main.cpp
#include <QApplication>
#include <QPrinter>
#include <QTextDocument>
#include <QFontDatabase>
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc,argv);
int id = QFontDatabase::addApplicationFont(":/BarcodeAV.ttf");
qDebug()<< "font"<< QFontDatabase::applicationFontFamilies(id)[0];
QString serialNumber = "ABC123";
QString messageBody;
messageBody += "<p style='font-size: large;'><b>Serial Number:</b> " + serialNumber + "</p>";
messageBody += "<p style='font-size: large; font-family=\"Console\"'><b>Serial Number:</b> " + serialNumber + "</p></p>";
QTextDocument document;
document.setHtml(messageBody);
QPrinter printer(QPrinter::PrinterResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("test.pdf");
document.print(&printer);
return 0;
}
Выходной PDF выглядит так:
Я не могу обернуть голову, почему / как это отличило бы базовую QString (messageBody) от тех, которые объединены в нее (serialNumber)?
Edit:: Нет изменений в выходных данных после попытки реализовать решение style.css, предложенное ниже
main.cpp
#include <QApplication>
#include <QPrinter>
#include <QTextDocument>
#include <QFontDatabase>
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc,argv);
int id = QFontDatabase::addApplicationFont(":/BarcodeAV.ttf");
qDebug()<< "font"<< QFontDatabase::applicationFontFamilies(id)[0];
QString serialNumber = "ABC123";
QString messageBody;
messageBody += "<p style='font-size: large;'><b>Serial Number:</b> " + serialNumber + "</p>";
messageBody += "<p style='font-size: large;'><b>Serial Number:</b> <span id=\"barcode\">" + serialNumber + "</span></p>";
QTextDocument document;
QFile file(":/style.css");
if(file.open(QFile::ReadOnly|QFile::Text)){
qDebug() << "Opened CSS";
}
else{
qDebug() << "Failed to open CSS:" << file.errorString();
}
document.setDefaultStyleSheet(file.readAll());
document.setHtml(messageBody);
QPrinter printer(QPrinter::PrinterResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("test.pdf");
document.print(&printer);
return 0;
}
style.css
@font-face {
font-family: K-O-D-E-39 Hidden;
src: url(':/BarcodeAV.ttf');
}
#barcode{
font-family: 'K-O-D-E-39 Hidden';
font-size: larger;
}
1 ответ
Чтобы иметь возможность очень просто приписывать атрибуты каждого тега, рекомендуется создать .css
файл, в этом файле мы будем использовать @font-face
который загружает источник через URL, в этом случае мой источник KODE-39 Hidden
и файл является barcode.ttf:
@font-face {
font-family: K-O-D-E-39 Hidden;
src: url('qrc:/barcode.ttf');
}
#barcode{
font-family: 'K-O-D-E-39 Hidden';
font-size: larger;
}
Затем шрифт добавляется через addApplicationFont()
и мы устанавливаем через идентификатор barcode
, CSS также должен быть добавлен через метод setTefaultStyleSheet в QTextDocument:
int main(int argc, char *argv[])
{
QApplication a(argc,argv);
int id = QFontDatabase::addApplicationFont(":/barcode.ttf");
qDebug()<< "font"<< QFontDatabase::applicationFontFamilies(id)[0];
QString serialNumber = "ABC123";
QString messageBody;
messageBody += "<p style='font-size: large;'><b>Serial Number:</b> " + serialNumber + "</p>";
messageBody += "<p style='font-size: large;'><b>Serial Number:</b> <span id=\"barcode\">" + serialNumber + "</span></p>";
QTextDocument document;
QFile file(":/style.css");
file.open(QFile::ReadOnly|QFile::Text);
document.setDefaultStyleSheet(file.readAll());
document.setHtml(messageBody);
QPrinter printer(QPrinter::PrinterResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("test.pdf");
document.print(&printer);
return 0;
}
Выход:
Полный пример можно найти по следующей ссылке.