加载非标准字体并将其显示在QTextDocument中

Loading non-standard fonts and displaying them in a QTextDocument

本文关键字:显示 QTextDocument 非标准 字体 加载      更新时间:2023-10-16

我认为问题完全在于QTextDocument对非标准字体的管理。尽管如此,我还是会概述一下我正在做的事情,以防我在代码的其余部分中忽略了一些内容。

我正在尝试混合打印富文本(使用qt支持的html标记格式化的文本)和图像。输出可以是PDF,也可以是物理打印输出。

我使用QImage和QTextDocument创建图像和文本,然后使用QPainter和QPrinter以连贯的PDF、xps或打印输出实际打印出结果。该应用程序在Windows 7/8下运行。

我需要将字体更改为非标准字体;在我的例子中,Myriad Pro Light和Myriad Pro-Semibold。默认情况下,这些字体不在windows上,所以我需要先为机器或应用程序安装它们。

该代码去掉了最不相关的部分,看起来像:

void MyClass::print(QPrinter* printer, MyPrintingSettings settings, QString myRichText)
{
    // load my fancy font
    QString fontPath = "MyriadPro-Light.otf";
    if(!QFile(fontPath).exists() ||
      (QFontDatabase::addApplicationFont(fontPath) == -1))
    {
         //this does not happen.
         qDebug() << "could not load font " << fontPath << " :-(n";
         return;
    }
    // Set the painter and printer for accurate printing of both text
    // and images, with correct re-scaling, regardless of user-selected
    // printer properties.
    printer->pageRect().moveTo(0,0);        
    QPainter m_painter(printer);
    setWindowSize(settings);
    setPrintedRectangle(settings);
    //set the default font for the painter.
    QFont font;
    font.setFamily("Myriad Pro Light");
    font.setPointSize(settings.defaultFontSize);
    m_painter.setFont(font);
    //Create a document for printing. 
    QTextDocument document;
    document.documentLayout()->setPaintDevice(printer);
    document.setDefaultFont(font);
    document.setDocumentMargin(0.0);
    // I believe this is where the font fails to be correctly used.
    document.setHtml(myRichText);
    //drawing/printing.
    document.drawContents(&m_painter);
    m_painter.end();
}

观察到的输出取决于确切的富文本字符串:

  • 对于像:QString myRichText = "my text"这样的字符串,将正确使用默认字体。这不是一个令人满意的解决方案,因为我需要更改富文本字符串中的字体。

  • 对于像:QString myRichText = "<span style="font-family:Myriad Pro Light;">my text</span>这样的字符串,字体使用不正确(而是使用tahoma)。

  • 在机器上"手动"安装字体不会改变任何内容。

  • 奖金问题:我不知道这是否是一个相关问题。如果除了"Myriad Pro Light"之外,我还为整台机器手动或通过QtApplication的代码安装了"Myriad-Pro Semibold",这两者之间似乎存在名称混淆:总是使用Semibold而不是Light,<b>标签会导致切换到bold tahoma。

长话短说:如何让QTextDocument在丰富的文本基础上正确设置文本的花哨的非标准字体?

Ugh。问题仅仅在于内容丰富的文本。

使用此:

QString myRichText = "<span style="font-family:'Myriad Pro Light';">my text</span>

效果好多了。

使用此:

QString myRichText = "<span style="font-family:'Myriad Pro Light' font-weight=100;">my <b>text</b></span>

还解决了"light"answers"semi-bold"之间的名称混淆问题。

感谢所有调查此事的人。