加载非标准字体并将其显示在QTextDocument中
Loading non-standard fonts and displaying them in a QTextDocument
我认为问题完全在于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"之间的名称混淆问题。
感谢所有调查此事的人。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Qt自定义QPush按钮未显示在布局上
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 显示基于用户输入的整数的字符
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 如何在 QML 中显示来自 QTextDocument 的分页文本?
- 加载非标准字体并将其显示在QTextDocument中