Qt - 如果在 html 中指定字体,QTextDocument 会中断自动换行

Qt - QTextDocument breaks word wrap if font is specified in html

我必须使用 QTextDocument 将 HTML 转换为 pdf,但是,如果我在 html 中指定字体(这就是我需要的),则自动换行结果会损坏。

要编译此代码,请在 .pro 中添加 QT += printsupport

示例:

#include <QGuiApplication>
#include <QPrinter>
#include <QTextDocument>

int main(int argc, char *argv[])
{
  QGuiApplication app(argc, argv);

  QPrinter printer(QPrinter::PrinterResolution);
  printer.setPaperSize(QPrinter::A4);
  printer.setOrientation(QPrinter::Portrait);
  printer.setOutputFormat(QPrinter::PdfFormat);
  printer.setOutputFileName("test.pdf");

  QString html;
  html.append("<center><pre style=\"font-size:26pt;font-family:DejaVu Sans Mono\"><br />");
  html.append("<b>Test 1:</b><br />");
  html.append("AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA<br />");
  html.append("<em>--------------------</em><br />");
  html.append("<b>Test 2:</b><br />");
  html.append("BBBBB BBBBB BBBBB BBBBB BBBBB BBBBB BBBBB<br />");
  html.append("<em>--------------------</em><br />");
  html.append("</pre></center><br />");

  QTextDocument document;
  document.setPageSize(printer.pageRect().size());
  document.setHtml(html);

  document.print(&printer);

  return 0;
}

在这种情况下,样式会自动换行。

示例 2:

#include <QGuiApplication>
#include <QPrinter>
#include <QTextDocument>
    
int main(int argc, char *argv[])
{
  QGuiApplication app(argc, argv);

  QPrinter printer(QPrinter::PrinterResolution);
  printer.setPaperSize(QPrinter::A4);
  printer.setOrientation(QPrinter::Portrait);
  printer.setOutputFormat(QPrinter::PdfFormat);
  printer.setOutputFileName("test.pdf");

  QString html;
  html.append("<center><br />");
  html.append("<b>Test 1:</b><br />");
  html.append("AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA<br />");
  html.append("<em>--------------------</em><br />");
  html.append("<b>Test 2:</b><br />");
  html.append("BBBBB BBBBB BBBBB BBBBB BBBBB BBBBB BBBBB<br />");
  html.append("<em>--------------------</em><br />");
  html.append("</center><br />");

  QTextDocument document;
  document.setPageSize(printer.pageRect().size());
  document.setDefaultFont(QFont("DejaVu Sans Mono", 26));
  document.setHtml(html);

  document.print(&printer);

  return 0;
}

在这种情况下它工作得很好。

我是不是遗漏了什么或者样式规范不能用于自动换行?

谢谢。

您只需要在

 的样式字段中添加以下文本:

white-space: pre-wrap

像这样:


#include <QGuiApplication>
#include <QPrinter>
#include <QTextDocument>

int main(int argc, char *argv[])
{
  QGuiApplication app(argc, argv);

  QPrinter printer(QPrinter::PrinterResolution);
  printer.setPaperSize(QPrinter::A4);
  printer.setOrientation(QPrinter::Portrait);
  printer.setOutputFormat(QPrinter::PdfFormat);
  printer.setOutputFileName("test.pdf");

  QString html;
  html.append("<center><pre style=\"font-size:26pt;font-family:DejaVu Sans Mono;white-space: pre-wrap;\"><br />");
  html.append("<b>Test 1:</b><br />");
  html.append("AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA AAAAA<br />");
  html.append("<em>--------------------</em><br />");
  html.append("<b>Test 2:</b><br />");
  html.append("BBBBB BBBBB BBBBB BBBBB BBBBB BBBBB BBBBB<br />");
  html.append("<em>--------------------</em><br />");
  html.append("</pre></center><br />");

  QTextDocument document;
  document.setPageSize(printer.pageRect().size());
  document.setHtml(html);

  document.print(&printer);

  return 0;
}