我试图从QTextDocument
生成一个PDF文件,该文件工作得很好。当我想为特定的<p></p>
对象使用自定义字体时,会出现问题。我尝试使用QFontDatabase::addApplicationFont()
的标准方法成功地将字体加载到应用程序中,但由于某种原因,它会写入以QString
为基础的所有基于messageBody
的变量而不是QTextFocument.setDefaultFont()
指定的,或者甚至是style={font-family:}
手动。
我这样做是错误的,还是忽略了某些东西,或者这是某种错误?
的main.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解决方案后输出没有变化
的main.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;
}
答案 0 :(得分:1)
为了能够以非常简单的方式定义每个标记的属性,建议创建.css
文件,在此文件中,我们将使用通过网址加载源的@font-face
,这种情况我的源是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()
添加字体,我们通过ID barcode
建立。还必须通过QTextDocument的setTefaultStyleSheet方法添加css:
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中找到。