我认为问题仅在于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”之外安装“Myriad Pro Semibold”,无论是手动为整台机器还是通过QtApplication的代码,两者之间似乎都存在名称混淆:总是使用Semibold而不是光,并且<b>
标签会导致切换为粗体tahoma。
所以,长话短说:如何让QTextDocument根据富文本正确设置文本的花哨的非标准字体?
答案 0 :(得分:0)
唉。问题只在于富文本。
使用此:
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>
...也解决了“轻”和“半大胆”之间的混淆名称。
感谢所有关注此事的人。