Пользовательский шрифт в 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)?


Изменить:: Никаких изменений в выводе после попытки реализовать решение 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;
}

person While-E    schedule 17.01.2018    source источник


Ответы (1)


Чтобы иметь возможность атрибутировать атрибуты каждого тега очень простым способом, рекомендуется создать файл .css, в этом файле мы будем использовать @font-face, который загружает источник через URL-адрес, в этом случае мой источник KODE-39 Hidden и файл штрих-кода .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() и устанавливаем через id 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;
}

Выход:

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

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

person eyllanesc    schedule 17.01.2018
comment
Хотя я все еще не понимаю, что вызвало мою первоначальную проблему (одна QString использовала определенный шрифт, другая использовала шрифт по умолчанию), это решило ее, так что спасибо. - person While-E; 17.01.2018
comment
Говорил слишком рано, забыл изменить еще несколько вещей при тестировании вашего решения, это не решает мою проблему. Каждое значение QString, которое я добавляю к большему QString (messageBody), всегда отображается шрифтом штрих-кода, но весь статический текст (серийный номер) отображается нормально... действительно странно - person While-E; 18.01.2018
comment
@While-E Вы можете предоставить минимально воспроизводимый пример вашей проблемы, чтобы увидеть, что ее вызывает. - person eyllanesc; 18.01.2018
comment
@ Пока-E Я только что попробовал то, что вы говорите, и я не наблюдаю проблему, возможно, вы не понимаете, на что вы ссылаетесь, поэтому я не могу это исправить, вы могли бы показать мне пример кода, который генерирует ошибку и неправильный вывод. - person eyllanesc; 18.01.2018
comment
Я только что отредактировал свой вопрос, включив в него точные файлы, которые я использую. Не уверен, что еще я могу предоставить. - person While-E; 18.01.2018
comment
@ Хотя вы можете показать изображение того, что получаете, вы также можете поделиться своим .ttf - person eyllanesc; 18.01.2018
comment
Что вы получаете, когда запускаете qDebug()<<"font"<<QFontDatabase::applicationFontFamilies(id)[0];? - person eyllanesc; 18.01.2018
comment
Я получаю BarcodeAV, как и ожидалось... .ttf не проблема, он явно работает, если выводит штрих-коды. Проблема заключается в том, что один QString выводится как штрих-код, а другой - со шрифтом по умолчанию, несмотря на то, что эти стили никогда не устанавливались вручную, а просто импортировались в БД. Кроме того, к исходному сообщению прикреплена картинка, это скриншот точного вывода. Несмотря на это, я обнаружил, что при сборке для рабочего стола этого не происходит, по какой-то причине только во время кросс-компиляции. - person While-E; 18.01.2018
comment
@While-E, если при использовании qDebug() << "font" << ... вы получаете BarcodeAV, тогда вы должны изменить в .css K-O-D-E-39 Hidden на BarcodeAV, K-O-D-E-39 Hidden — это название семейства моего шрифта, вместо него — BarcodeAV. - person eyllanesc; 18.01.2018
comment
Да, на рабочем столе это позволяет ему работать как положено. Опять же, при кросс-компиляции проблема заключается в том, что шрифт применяется глобально ко всем переменным QString, которые добавляются к основной переменной QString. Статический текст, который добавляется, в порядке, но добавляемые QString отображаются в шрифте штрих-кода, независимо от того, импортируется ли он в БД.... - person While-E; 18.01.2018
comment
@ Пока-E кажется, что это ошибка его версии Qt, которую он использует для кросс-компиляции, сообщите об этом. - person eyllanesc; 18.01.2018
comment
@eyllanesc @font-face необходим/действительно работает? Насколько я знаю, он не поддерживается в Qt, и я могу заставить собственный шрифт работать даже без этого, просто используя правильное семейство шрифтов. - person musicamante; 04.02.2021