开发笔记

  • 首页
  • 工具箱
三味线的博客
  1. 首页
  2. Qt
  3. 正文

Qt导出PDF(QPainter、QTextDocument)

2020-07-19 705点热度 3人点赞 0条评论
// 添加打印支持
QT       += printsupport
// 包含头文件
#include <QDesktopServices>
#include <QFileDialog>
#include <QTextBlock>
#include <QTextDocument>
#include <QPainter>
#include <QtPrintSupport/QPrinter>
#include <QUrl>

通过QPainter导出

QString outputFile = QFileDialog::getSaveFileName(this, "Save File","D://report.pdf","*.pdf");
if (outputFile.isEmpty()) {
    return;
}
QPrinter printer;
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setPageSize(QPagedPaintDevice::A4);
printer.setOutputFileName(outputFile);
printer.setOrientation(QPrinter::Landscape);
printer.setPageMargins(10, 10, 10, 10, QPrinter::Millimeter);
QPainter painter;
painter.begin(&printer);
painter.drawText(QRect(0, 0, printer.width(), printer.height()), "你好,世界!");
printer.newPage();
painter.drawText(QRect(0, 0, printer.width(), printer.height()), "你好,世界!");
painter.end();
QDesktopServices::openUrl(QUrl(outputFile));

通过QTextDocument导出

QString outputFile = QFileDialog::getSaveFileName(this, "Save File","D://report.pdf","*.pdf");
if (outputFile.isEmpty()) {
    return;
}
QPrinter printer;
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setPageSize(QPagedPaintDevice::A4);
printer.setOutputFileName(outputFile);
printer.setOrientation(QPrinter::Landscape);
printer.setPageMargins(10, 10, 10, 10, QPrinter::Millimeter);
QString html = QString("<table width='600' border='1' align='center' frame='border' cellspacing='0' cellpadding='3px' rules='all'>");
html += "<tr>";
// 表头字段
QStringList headers;
headers<<"标题1"<<"标题2"<<"标题3"<<"标题4"<<"标题5"<<"标题6";
for (QString ti: headers) {
    html += QString("<th>%1</th>").arg(ti);
}
html += "</tr>";
// 数据
for (int i = 0; i < 10; i++) {
    html += "<tr>";
    for (int j = 0; j < 6; j++) {
        html += QString("<td>内容%1</td>").arg(j+1);
    }
    html += "</tr>";
}
html += "</table>";
QTextDocument textDoc;
textDoc.setHtml(html);
textDoc.print(&printer);
textDoc.end();
QDesktopServices::openUrl(QUrl(outputFile));

这里有一个问题是给table设的属性未生效,可能是我Qt版本及其兼容问题。

同时使用

如果要导出的内容既需要painter绘制,也包含富文本,那么这样导出:

QString outputFile = QFileDialog::getSaveFileName(this, "Save File","D://report.pdf","*.pdf");
if (outputFile.isEmpty()) {
    return;
}
QPrinter printer;
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setPageSize(QPagedPaintDevice::A4);
printer.setOutputFileName(outputFile);
printer.setOrientation(QPrinter::Landscape);
printer.setPageMargins(10, 10, 10, 10, QPrinter::Millimeter);
QPainter painter;
painter.begin(&printer);
painter.drawText(QRect(0, 0, printer.width(), printer.height()), "你好,世界!");
printer.newPage();
painter.drawText(QRect(0, 0, printer.width(), printer.height()), "你好,世界!");

QString html = QString("<table width='%1' border='1' align='center' frame='border' cellspacing='0' cellpadding='3px' rules='all'>").arg(printer.width());
html += "<tr>";
// 表头字段
QStringList headers;
headers<<"标题1"<<"标题2"<<"标题3"<<"标题4"<<"标题5"<<"标题6";
for (QString ti: headers) {
    html += QString("<th>%1</th>").arg(ti);
}
html += "</tr>";
// 数据
for (int i = 0; i < 10; i++) {
    html += "<tr>";
    for (int j = 0; j < 6; j++) {
        html += QString("<td>内容%1</td>").arg(j+1);
    }
    html += "</tr>";
}
html += "</table>";
printer.newPage();
QTextDocument textDoc;
textDoc.setHtml(html);
textDoc.drawContents(&painter);
textDoc.end();
painter.end();
QDesktopServices::openUrl(QUrl(outputFile));

这里还有另一种写法:

// 替换textDoc.drawContents(&painter);
QAbstractTextDocumentLayout::PaintContext ctx;
ctx.clip = QRectF( 0, 0, printer.width(), printer.height());
textDoc.documentLayout()->draw(&painter, ctx);
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Qt
最后更新:2020-07-19

Clownce

不吃咸鱼的猫

点赞
< 上一篇
下一篇 >

文章评论

取消回复

Captcha Code

COPYRIGHT © 2020 Clownce. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

蜀ICP备18010095号