1.需要用的类
pro文件添加 QT += printsupport
QPdfWriter:写pdf的类
QTextDocument:支持html表格、图片的类
2.需要打印的界面
这里示例打印两个表格,一个水平方向的,一个垂直方向的,加一张图片。
3.保存的pdf效果如下
4.源码
添加两个表格和一张图片
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);QPixmap pixmap("./qtLogo.png");ui->label->setPixmap(pixmap);ui->t1->setColumnCount(2);ui->t1->setRowCount(4);ui->t1->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"班级");ui->t1->horizontalHeader()->setStretchLastSection(true);ui->t1->setItem(0,0,new QTableWidgetItem("Tom"));ui->t1->setItem(0,1,new QTableWidgetItem("二年级"));ui->t1->setItem(1,0,new QTableWidgetItem("mary"));ui->t1->setItem(1,1,new QTableWidgetItem("一年级"));ui->t1->setItem(2,0,new QTableWidgetItem("Bob"));ui->t1->setItem(2,1,new QTableWidgetItem("二年级"));ui->t1->setItem(3,0,new QTableWidgetItem("lili"));ui->t1->setItem(3,1,new QTableWidgetItem("三年级"));ui->t2->setColumnCount(4);ui->t2->setRowCount(2);ui->t2->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"地址"<<"年龄"<<"性别");ui->t2->horizontalHeader()->setStretchLastSection(true);ui->t2->setItem(0,0,new QTableWidgetItem("Tom"));ui->t2->setItem(0,1,new QTableWidgetItem("四川成都"));ui->t2->setItem(0,2,new QTableWidgetItem("16"));ui->t2->setItem(0,3,new QTableWidgetItem("男"));ui->t2->setItem(1,0,new QTableWidgetItem("mary"));ui->t2->setItem(1,1,new QTableWidgetItem("四川成都"));ui->t2->setItem(1,2,new QTableWidgetItem("15"));ui->t2->setItem(1,3,new QTableWidgetItem("女"));
}
保存pdf槽函数
void Widget::on_pushButton_clicked()
{WPdfWriter writer;writer.exportPdf();
}
WPdfWriter类,在这个类中,为了节约时间,导出的数据都是固定的。
#include "WPdfWriter.h"
#include <QPixmap>
#include <QPainter>WPdfWriter::WPdfWriter(QObject *parent): QObject(parent){}WPdfWriter::~WPdfWriter()
{if(m_pdfWriter)delete m_pdfWriter;
}void WPdfWriter::exportPdf()
{QString path = QFileDialog::getSaveFileName(nullptr,QString("Open file"),QString("."),QString("PDF Files(*.pdf)"));if(path.isEmpty())return;if(QFileInfo(path).suffix().isEmpty())path.append(".pdf");QFile pdfFile(path);if(!pdfFile.open(QIODevice::WriteOnly | QIODevice::Append))return;m_pdfWriter = new QPdfWriter(&pdfFile);m_pdfWriter->setPageSize(QPagedPaintDevice::A4);m_pdfWriter->setResolution(QPrinter::ScreenResolution);//添加标题m_html.append("<h1 style='text-align:center;'>导出数据</h1><br />");writePdf();//添加图片m_html.append("<img src='qtLogo.png' width=\"100\" height=\"100\">");QTextDocument textDocument;textDocument.setHtml(m_html);textDocument.print(m_pdfWriter);textDocument.end();pdfFile.close();
}void WPdfWriter::addTable(const QString &title, const QString &subTitle, int rows, int cols, QList<int> colWidth, const QList<QList<QString> > &values)
{m_html.append("<table border='0.5' cellspacing='0' cellpadding='3' width:100%>");//主标题if(!title.isEmpty()){m_html.append(QString("<tr><td align='center' style='vertical-align:middle;font-weight:bold;' colspan='%1'>").arg(cols));m_html.append(title);m_html.append("</td></tr>");}//副标题if(!subTitle.isEmpty()){m_html.append(QString("<tr><td align='left' style='vertical-align:middle;font-weight:bold;' colspan='%1'>").arg(cols));m_html.append(subTitle);m_html.append("</td></tr>");}//添加字段/字段值for(int i = 0;i < rows;i++){m_html.append("<tr>");QList<QString> rowValues = values.at(i);for(int j = 0;j < cols;j++){m_html.append(QString("<td width=%1% valign='center' style='vertical-align:middle;font-size:100px;'>").arg(colWidth.at(j)));m_html.append(rowValues.at(j));m_html.append("</td>");}m_html.append("</tr>");}m_html.append("</table><br /><br />");
}void WPdfWriter::writePdf()
{///添加基本信息QList<QString> rowsValues;QList<QList<QString>> values;//导出t1rowsValues.append("姓名");rowsValues.append("班级");values.append(rowsValues);rowsValues.clear();rowsValues.append("Tom");rowsValues.append("二年级");values.append(rowsValues);rowsValues.clear();rowsValues.append("mary");rowsValues.append("一年级");values.append(rowsValues);rowsValues.clear();rowsValues.append("Bob");rowsValues.append("二年级");values.append(rowsValues);rowsValues.clear();rowsValues.append("lili");rowsValues.append("三年级");values.append(rowsValues);QList<int> width;width.append(30);width.append(70);addTable("T1主标题","T1子标题",5,2,width,values);//导出t2rowsValues.clear();values.clear();rowsValues.append("姓名");rowsValues.append("地址");rowsValues.append("年龄");rowsValues.append("性别");values.append(rowsValues);rowsValues.clear();rowsValues.append("Tom");rowsValues.append("四川成都");rowsValues.append("16");rowsValues.append("男");values.append(rowsValues);rowsValues.clear();rowsValues.append("mary");rowsValues.append("四川成都");rowsValues.append("15");rowsValues.append("女");values.append(rowsValues);width.clear();width.append(25);width.append(25);width.append(25);width.append(25);addTable("T2主标题","T2子标题",3,4,width,values);
}
如下图代码中,我直接使用的html的语法加入的图片,有如下方法也可以加入图片。
m_pdfWriter = new QPdfWriter(&pdfFile);m_pdfWriter->setPageSize(QPagedPaintDevice::A4);m_pdfWriter->setResolution(QPrinter::ScreenResolution);//加入图片QPainter painter;painter.begin(m_pdfWriter);QPixmap pixmap("./qtLogo.png");painter.scale(10,10); //放大10倍painter.drawPixmap(0,0,pixmap);painter.end();