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

Выход:

введите описание изображения здесь

Полный пример можно найти по следующей ссылке.

Другие вопросы по тегам