【问题标题】:Custom font in QTextDocumentQTextDocument 中的自定义字体
【发布时间】:2018-06-26 15:18:08
【问题描述】:

我正在尝试从QTextDocument 生成一个 PDF 文件,它工作得很好。当我想为特定的<p></p> 对象使用自定义字体时,问题就出现了。我尝试使用QFontDatabase::addApplicationFont() 的标准方法,它成功地将字体加载到应用程序中,但由于某种原因,它写入了所有基于QString 的变量,这些变量以这种字体而不是@ 指定的字体添加到messageBody 987654328@,甚至可以手动通过style={font-family:}

是我做错了,还是在这里忽略了某些东西,或者这是某种错误?

ma​​in.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 解决方案后输出没有变化

ma​​in.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;
}

【问题讨论】:

    标签: css qt pdf fonts qtextdocument


    【解决方案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()添加,我们通过idbarcode建立。 css也必须通过QTextDocument的setTefaultStyleSheet方法添加:

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

    输出:

    完整的例子可以在下面的link找到。

    【讨论】:

    • 虽然我仍然对导致我原来的问题的原因感到困惑(一个 QString 采用某种字体,另一个采用默认字体)这解决了它,所以谢谢。
    • 说得太早了,我在测试您的解决方案时忘记更改其他一些内容,这并不能解决我的问题。我附加到较大 QString(messageBody) 的每个 QString 值始终采用条形码字体,但所有静态文本(“序列号”)都正常显示......真的很奇怪
    • @While-E 您可以提供问题的minimal reproducible example,看看是什么原因造成的。
    • @While-E 我只是尝试了你所说的,我没有观察到问题,也许你不明白你指的是什么,所以我无法纠正它,你可以给我看一个例子产生错误和错误输出的代码。
    • 我刚刚编辑了我的问题以包含我正在使用的确切文件。不知道我还能提供什么。
    猜你喜欢
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2011-09-07
    • 2011-04-12
    • 2012-07-24
    • 2020-12-18
    • 2017-09-15
    相关资源
    最近更新 更多