// 添加打印支持 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);
文章评论