加载非标准字体并在 QTextDocument 中显示它们

Posted

技术标签:

【中文标题】加载非标准字体并在 QTextDocument 中显示它们【英文标题】:Loading non-standard fonts and displaying them in a QTextDocument 【发布时间】:2013-08-16 15:17:28 【问题描述】:

我认为问题仅在于 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 = "&lt;span style="font-family:Myriad Pro Light;"&gt;my text&lt;/span&gt; 这样的字符串,字体使用不正确(改用 tahoma)。

在机器上“手动”安装字体不会改变任何东西。

额外问题:我不知道这是否是相关问题。如果我在“Myriad Pro Light”之外安装“Myriad Pro Semibold”,无论是手动安装整个机器还是通过 QtApplication 的代码,两者之间似乎存在名称混淆:始终使用 Semibold 而不是 light,和 &lt;b&gt; 标签会导致切换到粗体 tahoma。

那么,长话短说:如何让 QTextDocument 根据富文本正确设置文本的花哨的非标准字体?

【问题讨论】:

【参考方案1】:

呃。问题只是富文本。

使用这个:

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”和“semi-bold”之间的名称混淆。

感谢所有对此进行调查的人。

【讨论】:

以上是关于加载非标准字体并在 QTextDocument 中显示它们的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Asset Pipeline 从非标准目录传递字体

如何使用非标准字体编写电子邮件模板?

ActionScript 3 使用非标准字体在flash中设置文本样式的CSS

如何加载程序读取标准输入并在 gdb 中获取参数?

在 WPF 字体大小和“标准”字体大小之间转换

WebView 在 iOS 9 中不加载非标准端口